我想重构我在日常工作中大量使用的python库,以开源形式在github上发布它。在这样做之前,我希望符合python项目结构的某种最佳实践。我将在下面描述我想做的事,我将感谢您的建议。
这是我的库(mylib)结构:
mylib/
/examples/
simple_example.py
/mylib/
__init__.py
foo.py
bar.py
/tests/
test_foo.py
test_bar.py
这些是文件:
#foo.py
def Foo():
print("foo.Foo")
#bar.py
import foo
def Bar():
print("bar.Bar")
foo.Foo()
#test_bar.py
from ..mylib import bar #doesnt work!
class TestBar(unittest.TestCase):
def test_1(self):
bar.Bar()
self.assertEqual(True, True)
if __name__ == '__main__':
unittest.main()
#simple_example.py
from .. import foo #doesnt work!
from .. import bar #doesnt work!
if __name__ == '__main__':
foo.Foo()
bar.Bar()
我想做的是:
1-理想地从/ mylib / examples /执行simple_example.py:
$cd myapp
$cd examples
$python simple_example.py
Traceback (most recent call last):
File "simple_example.py", line 2, in <module>
from .. import foo
SystemError: Parent module '' not loaded, cannot perform relative import
2-最好从/ mylib / tests /执行一个测试文件:
$cd myapp
$cd tests
$python test_bar.py
Traceback (most recent call last):
File "test_bar.py", line 3, in <module>
from ..mylib import bar
SystemError: Parent module '' not loaded, cannot perform relative import
3-从mylib根目录执行所有测试
$cd myapp
$python -m unittest discover tests #same problem as above!
因此,问题出在simple_example.py和test_bar.py的import语句中。修复这些进口的最佳方法是什么?
请注意,我想使用python标准lib unittest进行单元测试。
谢谢
查理
运行测试代码时,您想进行绝对导入。这是因为在运行单元测试等时,应假定“库”以本地开发模式安装以进行测试-不要使用相对导入,因为您不在同一个程序包中。
例如,这是在test_foo.py
文件中进行导入的方式:
# test_foo.py
from mylib.foo import Foo
# ... your test code here
通常,只应在库代码中使用相对导入INSIDE,而不要在测试中使用=)
我希望这有帮助。
编辑:您还需要在开发模式下安装库,然后才能运行。您可以通过以下两种方式之一进行操作:
$ python setup.py develop
要么
$ pip install -e .
上面的两个命令中的任何一个都将检查项目的setup.py
文件,该文件会告诉Python如何构建/创建您的软件包,并将其本地安装,以便您可以对其进行测试/处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句