python - 使用 Tox 复制 setup.py 依赖项

标签 python testing setuptools tox

setup.py 通常依赖于一些外部文件,最值得注意的是 README.md for long_description,也许还有 VERSION 用于 version。例如

root = os.path.dirname(os.path.abspath(__file__))
setuptools.setup(
    name             = 'package',
    version          = open(os.path.join(root, 'VERSION')).read().strip(),
    description      = 'A Simple Package',
    long_description = open(os.path.join(root, 'README.md')).read().strip(),
    # ...
)

但是,当尝试在此类包上使用 tox 运行测试时,出现以下错误:

ERROR: invocation failed (exit code 1), logfile: 
.tox/py36/log/py36-6.log
ERROR: actionid: py36
msg: installpkg
cmdargs: 
['.tox/py36/bin/pip', 'install', '-U', '--no-deps', '.tox/dist/package-0.1.0.zip']

Processing ./.tox/dist/package-0.1.0.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "setup.py", line 10, in <module>
        version          = open(os.path.join(root, 'VERSION')).read().strip(),
    FileNotFoundError: [Errno 2] No such file or directory: 'VERSION'

(或带有 README.md 的类似消息)。显然,tox 只复制了 setup.py,当它试图运行它时,它的依赖项丢失了,它不起作用。

我查看了文档,但似乎找不到告诉 tox 复制这些文件的方法。有办法吗?

编辑

这是我的目录结构和相关文件:

$ ls
package/   tests/   README.md    VERSION   setup.py    tox.ini

$ cat tox.ini
[tox]
envlist = py36
[testenv]
deps     = pytest
commands = pytest tests

$ cat setup.py
import os
import setuptools
root = os.path.dirname(os.path.abspath(__file__))
setuptools.setup(
    name             = 'package',
    version          = open(os.path.join(root, 'VERSION')).read().strip(),
    description      = 'A Simple Package',
    long_description = open(os.path.join(root, 'README.md')).read().strip(),
    packages         = setuptools.find_packages(),
)

(如果我使用相对路径也会发生同样的情况,例如 open('README.md')。)

最佳答案

事实证明这不是 tox 问题,而是 setuptools 问题(或者更确切地说,我没有正确使用它)。我将答案发布在这里,以防其他人将来遇到类似问题。

tox 创建源代码分发(即 python setup.py sdist),然后将其安装在虚拟环境中,然后在其中运行测试。 正是这个发行版缺少 VERSIONREADME.md 文件,因为 setuptools 不包含任何非默认标准文件。即:

# create a source distribution
$ python setup.py sdist

# extract it
$ cd dist/
$ tar xfz package-0.1.0.tar.gz

# check it out
$ ls package-0.1.0
package    package.egg-info   PKG-INFO   setup.cfg   setup.py

# no VERSION or README.md :(

要包含非标准文件,请添加一个 MANIFEST.in 文件,如下所示:

include VERSION
include README.md

它告诉 setuptools 在分发中包含这些文件,并使 tox 按预期工作。

关于python - 使用 Tox 复制 setup.py 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925301/

相关文章:

python - 我同时安装了 python 2.7 和 3.5,但是 python 3.5 不能正常工作

unit-testing - 单元测试, Rhino, 单元测试的艺术

ruby-on-rails - 如何在 rspec 中使用 capybara 点击下拉选项

python - 在 setuptools 安装的脚本中使用 multiprocessing.Process

python - 没有名为 'pkg_resources' 的模块

python - 对按多列分组的数据框中的值进行排序

python - 将小部件添加到 Tkinter 颜色选择器

python - 调试由 FormRequest.from_response 发送的 header

testing - Cypress 在多个测试套件中重用测试用例

python - 在 Python 3.6 中使用 setuptools 打包后的 ModuleNotFoundError