Python项目目录结构/ pytest麻烦

Bas*_*sti 31 python path pytest

这应该是地球上最简单的问题,但即使经过大量的搜索和修补,我仍然在寻找一种"正确"的方式来构建目录结构并设法正确运行pytest等方面遇到了麻烦.

假设我有一个名为apple的程序.

|- README.md
|- apple
|   |-- __init__.py
|   |-- apple.py
| - tests
|   |-- test_everything.py
Run Code Online (Sandbox Code Playgroud)

apple.py包含一些函数,例如,让我们调用一个函数eat().该test_everything.py文件包含一些测试assert eat()=="foobar".好那么容易,但随后开始有趣:

  • __init__.py那苹果目录怎么样......对吗?空或应该在里面?
  • py.test从根目录调用是最佳做法吗?还是py.test tests
  • 很多项目都__init__.py在他们的测试目录中,但是在py.test文档中明确说明这是错误的.那么为什么上帝呢
  • test_everything.py文件顶部的内容是:a import apple还是from apple import *?或完全不同的东西
  • 你是通过eat()或调用函数apple.eat()吗?
  • 有些人甚至建议os.path.dirname在python中进行操作

这应该很容易,但我已经看到了上述的所有组合,甚至没有谈到tox和无数其他工具.然而,有一点点错误,你会被抛出一些ImportError: No module named 'apple'或其他一些时髦的错误.

什么是"正确"的方式?github等上的建议和现有代码遵循极为不同的约定.对于经验丰富的中档编码器,这应该更容易.

the*_*orn 17

  1. __init__.py那苹果目录怎么样......对吗?空或应该在里面?

是,对的.最常见的是空洞.如果你放入foo = 42它,你可以稍后做from apple import foo,from apple.apple import foo如果你把它放进去你需要做的apple.py.虽然看起来很方便,但你应该谨慎使用它.

  1. 从根目录调用py.test是最佳做法吗?还是py.test测试?

py.test应该能够找到你的测试,但见下文..

  1. 很多项目都__init__.py在他们的测试目录中,但是在py.test文档中明确说明这是错误的.那么为什么上帝呢

因此,您可以在提供常用测试功能的测试中导入文件.在py.test中,可以通过在名为的文件中创建fixture来更好地实现tests/conftest.py.

  1. test_everything.py文件顶部的内容是:导入苹果还是来自apple import*?或完全不同的东西

from apple import apple

  1. 你通过eat()或apple.eat()调用函数吗?

apple.eat()

  1. 有些人甚至建议在python中操作os.path.dirname

这看起来非常脆弱.我也建议

(a)将环境变量PYTHONPATH设置为指向README.md或更好的文件夹

(b)创建一个setup.py文件(与文件处于同一级别README.md),这是一个最小的文件:

from setuptools import setup
setup(name='apple', packages=['apple'])
Run Code Online (Sandbox Code Playgroud)

像这样运行文件:

python setup.py develop
Run Code Online (Sandbox Code Playgroud)

现在apple全局可用,你永远不会再看到no module named apple问题,即你可以从根文件夹或tests文件夹运行py.test.

您可以setup.py在Python包装用户指南中阅读更多信息,网址https://python-packaging-user-guide.readthedocs.org/en/latest/index.html

  • 我已经[创建了一个存储库](https://github.com/Seanny123/derpland) 展示了如何使用 `setup.py` 方法完成任务。 (2认同)

Bru*_*ira 5

我已经安排了一个有效的例子 在这里

我认为模块的 命名apple令人困惑,也许这是混淆的来源之一。IMO 唯一不明显的部分是,PYTHONPATH如果您没有使用正确的setup.pydistutils 软件包来安装您的apple软件包,则必须设置为当前目录。