用Tox复制setup.py依赖项

Dan*_*tik 2 python testing setuptools tox

setup.py通常取决于几个外部文件,尤其是README.mdfor long_description,也许是VERSIONfor 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(),
    # ...
)
Run Code Online (Sandbox Code Playgroud)

但是,当尝试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'
Run Code Online (Sandbox Code Playgroud)

(或带有的类似消息README.md)。显然,tox只有copys 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(),
)
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*tik 5

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

tox创建源分发(即python setup.py sdist),然后将其安装在虚拟环境中,然后在虚拟环境中运行测试。正是缺少了VERSIONand README.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 :(
Run Code Online (Sandbox Code Playgroud)

要包括非标准文件,请添加如下MANIFEST.in文件:

include VERSION
include README.md
Run Code Online (Sandbox Code Playgroud)

它告诉setuptools将这些文件包括在分发中,并按tox预期进行工作。