Python项目目录结构/pytest故障

Python项目目录结构/pytest故障,python,path,pytest,Python,Path,Pytest,这应该是地球上最简单的问题,但即使经过广泛的搜索和修补,我仍然很难找到一种“正确”的方法来放置目录结构和正确运行pytest等 假设我有一个叫做苹果的程序 |- README.md |- apple | |-- __init__.py | |-- apple.py | - tests | |-- test_everything.py py包含一些函数,例如,让我们调用一个eat()。而test\u everything.py文件包含一些测试,如assert eat()=“fooba

这应该是地球上最简单的问题,但即使经过广泛的搜索和修补,我仍然很难找到一种“正确”的方法来放置目录结构和正确运行pytest等

假设我有一个叫做苹果的程序

|- README.md
|- apple
|   |-- __init__.py
|   |-- apple.py
| - tests
|   |-- test_everything.py
py包含一些函数,例如,让我们调用一个
eat()
。而
test\u everything.py
文件包含一些测试,如
assert eat()=“foobar”
。很好,很容易,但乐趣开始了:

  • 苹果目录中的
    \uuuu init\uuuu.py
    怎么样。。。对的里面应该是空的还是什么
  • 从根目录调用
    py.test
    是最佳做法吗?或
    py.test测试
  • 很多项目的测试目录中都有一个
    \uuuuu init\uuuuuu.py
    ,但是py.test文档中明确指出这是错误的。那么为什么是上帝呢
  • test_everything.py
    文件的顶部是什么:导入apple还是从apple导入*?或者完全是别的什么
  • 然后您是通过
    eat()
    还是
    apple.eat()
    调用函数
  • 有些人甚至建议在python中操作
    os.path.dirname
这应该很容易,但我已经看到了上面的每一个组合,甚至没有提到tox和其他无数工具。然而,只要有一点点错误,就会抛出一些导入错误:没有名为“apple”的模块,或者出现其他一些令人讨厌的错误


“正确”的方法是什么?github等上的建议和现有代码遵循截然不同的约定。对于一个中等经验的程序员来说,这应该容易得多。

我已经安排了一个有效的示例

我认为给软件包模块
apple
命名都很混乱,也许这是造成混乱的原因之一。唯一不明显的一点是,如果没有使用正确的
setup.py
distutils软件包来安装
apple
软件包,则必须将
PYTHONPATH
设置到当前目录

  • 苹果目录中的
    \uuuu init\uuuu.py
    怎么样。。。对的里面应该是空的还是什么
  • 是的,没错。通常是空的。如果您将
    foo=42
    放入其中,您可以稍后从apple import foo执行
    ,而如果您将其放入
    apple.py
    中,则需要从apple.apple import foo执行
    。虽然看起来很方便,但你应该少用

  • 从根目录调用py.test是最佳做法吗?还是py.test测试
  • 不管怎样,py.test都应该能够找到您的测试,但请参见下文

  • 很多项目的测试目录中都有一个
    \uuuuu init\uuuuuu.py
    ,但是py.test文档中明确指出这是错误的。那么为什么是上帝呢
  • 因此,您可以在提供公共测试功能的测试中导入文件。在py.test中,通过在名为
    tests/conftest.py
    的文件中创建装置,可以更好地实现这一点

  • test_everythings.py文件顶部是什么:导入apple还是从apple导入*?或者完全是别的什么

  • 从苹果进口苹果

  • 那么您是通过eat()还是apple.eat()调用这些函数呢
  • apple.eat()

  • 有些人甚至建议在python中操作os.path.dirname
  • 这看起来很脆弱。我建议两者都可以

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

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

    from setuptools import setup
    setup(name='apple', packages=['apple'])
    
    按如下方式运行文件:

    python setup.py develop
    
    现在,
    apple
    在全球范围内可用,您将永远不会再看到名为apple
    无模块问题,即您可以从根文件夹或tests文件夹运行py.test


    你可以在Python打包用户指南中阅读更多关于
    setup.py
    的信息,网址是

    我已经展示了如何使用
    setup.py
    方法完成任务。
    来自apple import的
    apple
    在内部不起作用
    测试一切.py
    ModuleNotFoundError:没有名为“apple”的模块
    @endolith它起作用,虽然如果cwd=apple或您没有运行setup.py develope等,则可能不会。这是2014年的公认答案,分数为7,如果你不能让它发挥作用,那么很有可能这是你这边的一个问题——你更可能通过提出一个新问题而不是留下一条缺乏上下文/细节的评论来获得帮助……这确实令人困惑。我的假设是,apple import apple的
    中的第一个“apple”指的是文件夹名。因此,包的名称。第二个“苹果”是指文件名。那么,模块的名称。现在,要真正设置项目,必须正确配置并执行一个必需的setup.py文件。我想,很多信息必须事先知道?我需要多少个包,它们将如何命名。或者是否有使用setup.py的通用工作流?比如偶尔点击
    python setup.py
    将项目引入新文件?如果创建单独的测试,至少将您的apple alias源代码放入
    src
    目录中