我在一个目录中安排了一个python模块。叫它吧
foo
.
以下是文件布局:
caller.py
foo/__init__.py
foo/bar.py
foo/test/bar_test.py
也就是说,模块被调用
福
以及密码
foo/__init__.py
当
import foo
陈述
caller.py
开始跑步。
内
foo/uuu初始版本
,我希望访问
bar.py
. 这是用来做的
import foo.bar
.
我的问题出现在编写运行在
foo/test/bar_test.py
. 如果这个文件只是
foo/bar_test.py
,那么它也可以使用
导入foo.bar
导入的内容
foo.bar.py
. 不幸的是,我们有一个编码标准,规定单元测试放在名为
tests
.
考虑到编码标准,我们如何导入bar.py?
这不起作用:
# foo/test/bar_test.py
import foo.bar
def test_return5():
assert bar.return5() == 5
它给了我:
$ py.test
================================================== test session starts ==================================================
platform linux -- Python 3.6.3, pytest-3.2.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/hadoop/xxx/foo, inifile:
collected 0 items / 1 errors
======================================================== ERRORS =========================================================
___________________________________________ ERROR collecting test/bar_test.py ___________________________________________
ImportError while importing test module '/home/hadoop/xxx/foo/test/bar_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/bar_test.py:3: in <module>
import foo.bar
E ModuleNotFoundError: No module named 'foo'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
================================================ 1 error in 0.10 seconds ================================================
这是可行的,但很恶心:
# foo/test/bar_test.py
import os
import sys
sys.path.append( os.path.join(os.path.dirname(__file__), "../.."))
import foo.bar
def test_return5():
assert foo.bar.return5() == 5
这不起作用:
# foo/test/bar_test.py
import os
import sys
sys.path.append( os.path.join(os.path.dirname(__file__), ".."))
import bar
def test_return5():
assert bar.return5() == 5
因为:
$ py.test
================================================== test session starts ==================================================
platform linux -- Python 3.6.3, pytest-3.2.1, py-1.4.34, pluggy-0.4.0
rootdir: /home/hadoop/xxx/foo, inifile:
collected 0 items / 1 errors
======================================================== ERRORS =========================================================
___________________________________________ ERROR collecting test/bar_test.py ___________________________________________
ImportError while importing test module '/home/hadoop/xxx/foo/test/bar_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/bar_test.py:8: in <module>
import bar
bar.py:3: in <module>
import foo
E ModuleNotFoundError: No module named 'foo'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
================================================ 1 error in 0.10 seconds ================================================
因为bar.py有:
# foo/bar.py
import foo
def return5():
return 5