我想将测试与程序包代码放在一个单独的文件夹中,这样我就可以从项目的顶层目录中运行python sample/run.py
或python tests/test_run.py
,并使它们都解决所有问题。正确导入。
我的目录结构如下:
sample/
__init__.py
helper.py
run.py
tests/
context.py
test_run.py
我知道应该有很多方法可以实现这一目标,如此处所述:Python imports for tests using nose - what is best practice for imports of modules above current package
但是,当我尝试运行python tests/test_run.py
时,会为'helper'得到 ModuleNotFoundError ,因为'sample / run.py'会导入'sample / helper.py'。< / p>
特别是,我尝试遵循使用以下命令显式修改路径的约定(在Hitchhiker's Guide to Python中建议)。
import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
结果,我有一个空白的sample/__init__.py
以及以下代码文件。
sample / run.py:
from helper import helper_fn
def run():
helper_fn(5)
return 'foo'
if __name__ == '__main__':
run()
sample / helper.py:
def helper_fn(N):
print(list(range(N)))
tests / context.py:
import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import sample
tests / test_run.py:
from context import sample
from sample import run
assert run.run() == 'foo'
所以我有两个问题:
sample/run.py
和tests/test_run.py
?答案 0 :(得分:2)
编辑:
要同时使sample/run.py
和tests/test_run.py
正常工作,应将sample
目录的路径添加到python路径中。因此,您的tests/context.py
应该是
import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../sample')))
import sample
此更改将使Python知道helper
模块的路径。
sample/run.py
应该是:
from .helper import helper_fn
def run():
helper_fn(5)
return 'foo'
if __name__ == '__main__':
run()
软件包3中的隐式相对导入在Python 3中不可用。请检查以下内容:
已对导入系统进行了更新,以完全实施PEP 302的第二阶段。不再有任何隐式导入机制-完整的导入系统通过sys.meta_path公开。此外,还实现了本地名称空间包支持(请参阅PEP 420)。 link
此documentation可能有助于理解包装内参考。