擅长:python、mysql、java
<p>如果要在已安装的代码上运行测试,则需要一个包含所有将要安装的源代码的中间目录(而不是包);该目录的通用名称就是<code>src</code>。布局示例:</p>
<pre><code>project_root
├── src
│ ├── spam
│ │ ├── __init__.py
│ │ └── eggs.py
│ └── ...
├── tests
│ ├── test_spam.py
│ └── ...
└── setup.py
</code></pre>
<p>调整设置脚本以符合<code>src</code>目录:</p>
<pre><code># setup.py
from setuptools import setup, find_packages
setup(
name='spam',
...
packages=find_packages('src'),
package_dir={'': 'src'},
...
)
</code></pre>
<p>在这个布局中,尽管当前目录(<code>project_root</code>)仍然被添加到<code>sys.path</code>,但是所有的包都被隐藏起来,无法导入。这样,您就被迫安装包来调用测试,并且总是测试已安装的代码。通常,您在编写代码时通过本地计算机上的<code>pip install editable .</code>以开发模式安装包,然后通过CI服务器上的<code>pip install .</code>安装包,测试将在实际的包安装上执行。另一个优点是,这种布局不允许您在安装脚本中导入包的源代码,安装时不会遇到问题(要安装代码,必须已经安装了代码)。你知道吗</p>
<p>如果您有松散的模块,我更喜欢使用<code>pathlib</code>进行全局绑定:</p>
<pre><code>py_modules=[p.name for p in pathlib.Path('src').glob('*.py')]
</code></pre>
<p>如果您仍然需要Python 2兼容性,解决方案可能如下所示:</p>
<pre><code>py_modules=[os.path.splitext(os.path.basename(p))[0] for p in glob.glob("src/*.py")]
</code></pre>