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
),然后将其安装在虚拟环境中,然后在其中运行测试。 正是这个发行版缺少 VERSION
和 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 :(
要包含非标准文件,请添加一个 MANIFEST.in
文件,如下所示:
include VERSION
include README.md
它告诉 setuptools
在分发中包含这些文件,并使 tox
按预期工作。
关于python - 使用 Tox 复制 setup.py 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925301/