首先:对不起,我知道有很多关于进口的问题,但我只是没有找到解决办法。如果可能,我想使用以下目录布局:
myClass/
__init__.py
test/
demo.py
benchmark.py
specs.py
src/
__init__.py
myClass.py
现在我的问题是:
包中的测试文件如何正确导入myClass.py?
假设将myClass作为libs/myClass或include/myClass中的子模块,您将如何从外部导入包?
到目前为止,我还没有找到一个优雅的解决方案。根据我的理解Guido's Decision应该可以执行from ..src import myClass
,但这将出错:
ValueError: Attempted relative import in non-package
看起来它没有把我的类当作包。Reading the docs:
The __init__.py files are required to make Python treat the directories as containing packages;
似乎我遗漏了一些指定包的脚本在哪里的内容,应该使用.pth吗?
昨晚经过几个小时的搜索,我找到了python中相关导入的答案!!或者至少是一个简单的解决方案。解决此问题的最佳方法是从另一个模块调用模块。所以说您希望
demo.py
导入myClass.py
。在子包根目录下的myClass
文件夹中,它们需要一个调用其他两个包的文件。从我收集的信息来看,工作目录总是被认为是__main__
,因此如果使用demo.py
脚本测试从demo.py
导入,您将收到该错误。举例说明:文件夹层次结构:
我的班级.py:
演示.py:
主.py:
如果在解释器中运行
demo.py
,将生成错误,但运行main.py
不会。这有点复杂,但很有效:DIntra-package-references描述如何从
test/*
中myClass
。要从外部导入包,应在运行导入程序应用程序之前将其路径添加到PYTHONPATH
环境变量,或在导入前将其添加到代码中的sys.path
列表。为什么
from ..src import myClass
失败:可能,src
不是python包,您不能从那里导入。您应该将其添加到python path中,如上所述。意味着您试图在非包的模块中使用相对导入。它的问题在于包含此
from ... import
语句的文件,而不是您试图导入的文件。因此,如果您在测试中执行相对导入,例如,您应该将测试作为包的一部分。这意味着
__init__.py
添加到测试/如果以
python myClass/test/demo.py
的形式运行某个程序,则相对导入也将不起作用,因为您运行的是演示模块而不是包。相对导入要求使用它们的模块本身被导入为包模块,from myClass.test.demo import blabla
,或者使用相对导入。相关问题 更多 >
编程相关推荐