无法从其他目录导入python模块
我在python3中有以下代码结构:无法从其他目录导入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导入
- 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
。注意模块路径中的点(
)而不是斜杠(/
),它们不是单元测试。它们是从命令行运行项目的演示代码。