Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从其他目录导入python模块_Python_Python 3.x - Fatal编程技术网

无法从其他目录导入python模块

无法从其他目录导入python模块,python,python-3.x,Python,Python 3.x,我在python3中有以下代码结构: - datalake __init__.py utils __init__.py utils.py lambdas __init__.py my-lambdas.py - tests __init__.py demo.py 所有init__u;.py文件均为空 我的问题是如何从tests/demo.py导入datalake模块? 我在demo.py中尝试了从datalake.utils导入

我在python3中有以下代码结构:

- datalake
  __init__.py
  utils
     __init__.py
     utils.py
  lambdas
     __init__.py
     my-lambdas.py
- tests
    __init__.py
    demo.py
所有
init__u;.py
文件均为空

我的问题是如何从
tests/demo.py
导入
datalake
模块? 我在
demo.py
中尝试了从datalake.utils导入utils,但是当我从命令行运行
python测试/demo.py
时,我得到了这个错误
modulenofounderror:没有名为“datalake”的模块

如果我使用此代码:

from ..datalake.utils import utils
我将获得错误
ValueError:尝试在顶级包之外进行相对导入

我还尝试从
my lambda.py
文件导入模块
utils
,但也失败了。
my lambda.py
中的代码是来自datalake.utils import utils的
,但是我从命令行运行
python datalake/lambda/my lambda.py
时得到了
ModuleNotFoundError:没有名为“datalake”的模块

如何导入模块?

您可以尝试运行:

python-m datalake.lambda.my-lambda

如下所示:

您可以将模块目录添加到您的
系统路径中

import sys
sys.path.append("your/own/modules/folder")  # like sys.path.append("../tests")

但是这是一个一次性的方法,此时才有效,添加的路径不是永久的,它将在代码完成执行后被删除。

首先,
my lambdas.py
不能与
import
语句一起导入,因为连字符在Python标识符中无效。试着跟随,例如
mylambdas.py

否则,包结构看起来很好,只要您处于
datalake/
以上的级别,它就应该是可导入的,例如,如果您位于下面的目录
myproject/

myproject
├── datalake
│   ├── __init__.py
│   ├── utils
│   │   ├── __init__.py
│   │   └── utils.py
│   └── lambdas
│       ├── __init__.py
│       └── mylambdas.py
└── tests
    ├── __init__.py
    └── demo.py
那么这应该是可行的:

~/myproject$ python -c 'from datalake import utils'
否则,将环境变量PYTHONPATH设置为
datalake/
上方的路径或修改
sys.path
都是更改Python导入位置的方法。更多信息,请参见官方网站

还有一些一般性建议:我发现在需要扩展之前,坚持使用简单的模块而不是包(目录)是很有用的。然后,您可以将
foo.py
更改为带有
\uuu init\uuuuuuuuuuuuuupy
文件的
foo.py
目录,并且
import foo
将像以前一样工作,尽管您可能需要向
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuupy
添加一些导入以保持API兼容性。这将为您提供一个更简单的结构:

myproject
├── datalake
│   ├── __init__.py
│   ├── utils.py
│   └── lambdas.py
└── tests
    ├── __init__.py
    └── demo.py

当您运行类似于
python tests/demo.py
的命令时,您所在的文件夹不会添加到PYTHONPATH,脚本文件夹会添加到PYTHONPATH。因此,像导入datalake这样的顶级导入将失败。要解决此问题,您可以将测试作为模块运行:

Python 2:

python-m测试/演示
Python 3:

python-m tests.demo
demo.py
中导入的任何
datalake
都可以工作


听起来您真正想要做的是在主应用程序中单独设置一个包含测试的文件夹并运行它们。对于这一点,我建议,对于你的情况,你可以阅读如何做到这一点。TL;DR是从顶层项目文件夹中使用
python-mpy.test
运行测试的,它会工作。

是PYTHONPATH上的父目录(包含datalake和测试的目录)吗?我认为如果是,它应该找到模块。它不是。我是否必须在
PYTHONPATH
上添加路径作为环境变量?我在运行'python-m tests/demo'时遇到了这个错误
没有名为tests/demo'的模块。我还需要更改什么吗?@ZhaoYi您是否在顶级项目文件夹中?因此,您当前所在的文件夹中是否存在
tests/demo.py
?是的,文件
tests/demo.py
存在于当前目录中,该目录是project@ZhaoYi很抱歉,这种语法似乎只适用于Python2。改用
python-mtests.demo
。如何从命令行运行
tests/demo.py
?如果我当前在
myproject
目录下,运行
python-m tests/demo
会给我
没有名为tests/demo的模块
错误。如果这些是单元测试,单元测试框架通常会有一个运行程序来发现它们。例如,对于(顺便说一句,这很好),您只需从
myproject/
运行
pytest
,它将发现适当命名的文件(但它们的名称应类似于
test\u lambdas.py
)。如果您希望以交互方式运行
demo.py
,请尝试
python-mtests.demo
。注意模块路径中的点(
)而不是斜杠(
/
),它们不是单元测试。它们是从命令行运行项目的演示代码。