使用Tox复制setup.py的依赖项

7

setup.py通常依赖于一些外部文件,其中最重要的是README.md用于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在与tox.ini文件(因此还包括您的README和VERSION)相同的目录中运行,因此不应该存在问题。我们可以看一下您的tox.ini吗? - phd
2个回答

11

结果证明这不是个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按预期工作。


3
你使用的 setuptools 版本是什么?
我遇到了类似的问题,升级 setuptools 后问题得到解决。
从版本 36.4.0 开始,似乎自动包含了 README.md 文件。但是需要在 MANIFEST.in 文件中包含 VERSION 文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接