【问题标题】:Copying setup.py Dependencies with Tox使用 Tox 复制 setup.py 依赖项
【发布时间】:2017-12-21 12:44:54
【问题描述】:

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吗?

标签: python testing setuptools tox


【解决方案1】:

原来这不是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 按预期工作。

【讨论】:

    【解决方案2】:

    你使用的是什么版本的setuptools

    我遇到了类似的问题,升级setuptools 解决了它。

    似乎包含README.md 是从version 36.4.0 自动完成的。但是VERSION 文件必须包含在MANIFEST.in 文件中。

    【讨论】:

      猜你喜欢
      • 2015-07-04
      • 2023-04-06
      • 2021-07-24
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多