Copying setup.py Dependencies with Tox

不打扰是莪最后的温柔 提交于 2019-12-02 02:49:34

问题


setup.py often depends on a couple external files, most notably README.md for long_description, and maybe VERSION for version. e.g.

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(),
    # ...
)

However, when trying to run tests with tox on such a package, I get the following error:

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'

(Or a similar message with README.md). Obviously, tox only copies setup.py, and when it tries to run it, its dependencies are missing and it doesn't work.

I went over the documentation, but I can't seem to find a way to tell tox to copy these files. Is there a way to do it?

EDIT

Here's my directory structure and relevant files:

$ 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(),
)

(The same happens if I use a relative path, e.g. open('README.md').)


回答1:


Turns out it's not a tox problem, but a setuptools one (or rather, me not using it correctly). I'm posting the answer here just in case somebody else runs into similar problems in the future.

tox creates a source distribution (i.e. python setup.py sdist), and then installs it in a virtual environment, where it then runs the tests. It's this distribution that's missing the VERSION and README.md files, because setuptools doesn't include any non-standard files by default. To wit:

# 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 :(

To include non-standard files, add a MANIFEST.in file like this:

include VERSION
include README.md

Which tells setuptools to include these files in the distribution, and makes tox work as expected.



来源:https://stackoverflow.com/questions/47925301/copying-setup-py-dependencies-with-tox

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!