假设文件层次结构如下:
|--WORKSPACE
|--main.py
|--subdir
| --__init__.py
| --sub1.py
| --sub2.py
在python2中,我想在子模块脚本文件中所有模块代码的下面放置一些测试代码,然后我可以运行并检查结果。让正在运行的根路径为WORKSPACE。例如 在main.py中,我会写
from subdir import sub1
和sub1.py中的
from sub2 import something
if __name__ == '__main__':
do some tests
在python3中,我必须这样写:
from subdir.sub2 import something
当运行目录为subdir时,它肯定会因导入错误而停止...因此我必须将pwd更改为WORKSPACE。我认为这不是一种优雅的方法,是否还有其他方法可以在subdir中运行作为替代方法?
答案 0 :(得分:0)
它不需要目录名称。例如,假设
├── main.py
└── subdir
├── __init__.py
├── sub1.py
└── sub2.py
在main.py
from subdir import sub2
sub2.foo()
在/subdir/sub1.py
中from sub2 import foo
if __name__ == '__main__':
foo()
在/subdir/sub2.py
中def foo():
print("foo!")
无论我在哪里运行sub1,无论使用WORKSPACE都是有效的
答案 1 :(得分:0)
别那样做。组织您的软件包并在其中使用相对导入,而无需提及父软件包名称。
如果需要,请使用子包。最后(或者从一开始就取决于您的心情),创建一个名为tests
的子包,其中包含所有测试。从那里导入要在软件包中测试的内容,就像从软件包中任何其他位置导入一样。使用模块unittest
来编写unittest.TestCase
的内部测试子包。
从软件包根目录执行python -m unittest discover
,请参见here或自定义测试运行和输出报告,请参见here。您可能需要研究该帮助页面一段时间。
现在,您可以一次运行所有测试,尽管有些方法只能选择其中一些。
答案 2 :(得分:0)
我想你可以添加
import sys
sys.path.append('subdir')
from subdir import sub1
发送到您的main.py
,
这样,它将为您获取该子文件夹中的所有相对导入,而无需每次都调用该子文件夹
和sub1.py
中的
from sub2 import foo