这应该是世界上最简单的问题,但即使经过广泛的搜索和修补,我仍然在找到一个正确的问题时遇到了很大的麻烦。建立目录结构并管理正确运行pytest等的方法。
让我说我有一个名为apple的程序。
|- README.md
|- apple
| |-- __init__.py
| |-- apple.py
| - tests
| |-- test_everything.py
apple.py包含一些功能,例如,我们可以调用一个eat()
。 test_everything.py
文件包含一些测试,例如assert eat()=="foobar"
。好那么容易,但随后开始有趣:
__init__.py
怎么样?对吗?空或应该在里面?py.test
吗?或py.test tests
?__init__.py
,但在py.test文档中明确说明这是错误的。那么为什么上帝为什么test_everything.py
文件顶部的内容:import apple
或from apple import *
?或其他完全eat()
或apple.eat()
os.path.dirname
这应该很简单,但我已经看到了上述的所有组合,甚至没有谈到tox和无数其他工具。但是有一点点错误,你会被抛出一些ImportError: No module named 'apple'
或其他一些时髦的错误。
什么是"权利"办法? github等上的建议和现有代码遵循极为不同的约定。对于经验丰富的中档编码器,这应该更容易。
答案 0 :(得分:15)
__init__.py
怎么样?对吗?空或应该在里面?是的,没错。最常见的是空洞。如果您将foo = 42
放入其中,则可以稍后执行from apple import foo
,如果您将from apple.apple import foo
放入apple.py
,则需要__init__.py
。虽然看起来很方便,但你应该谨慎使用它。
py.test应该能够找到你的测试,但请看下面..
tests/conftest.py
,但在py.test文档中明确说明这是错误的。那么为什么上帝为什么因此,您可以在提供常见测试功能的测试中导入文件。在py.test中,通过在名为from apple import apple
的文件中创建夹具可以更好地实现。
apple.eat()
README.md
这似乎非常脆弱。我建议
(a)将环境变量PYTHONPATH设置为指向README.md
或更好的文件夹
(b)创建一个setup.py文件(与from setuptools import setup
setup(name='apple', packages=['apple'])
文件处于同一级别),这里只是最小的一个:
python setup.py develop
像这样运行文件:
apple
现在no module named apple
全局可用,您再也不应该看到setup.py
问题,即您可以从根文件夹或测试文件夹运行py.test。
您可以在https://python-packaging-user-guide.readthedocs.org/en/latest/index.html
的Python包装用户指南中阅读有关{{1}}的更多信息答案 1 :(得分:2)
我安排了一个有效here的例子。
我认为将包和模块 apple
命名为混淆,这可能是混淆的一个原因。 IMO唯一不明显的部分是,如果您没有使用正确的PYTHONPATH
distutils软件包来安装setup.py
软件包,则必须将apple
设置为当前目录。