我使用 pip 和 setuptools 来安装一个包。我希望 pip 将一些资源文件复制到/etc/my_package
.
我的setup.py
看起来像这样:
setup(
...
data_files=[('/etc/my_package', ['config.yml'])]
)
Run Code Online (Sandbox Code Playgroud)
运行时pip install
,文件以
~/.local/lib/python3.5/site-packages/etc/my_package/config.yml
Run Code Online (Sandbox Code Playgroud)
而不是/etc/my_package
.
我究竟做错了什么?
(点子版本 9.0.1)
简短回答:用于pip install --no-binary :all:
安装您的软件包。
我为此苦苦挣扎了一段时间,最终发现data_files
二进制轮和源分发之间的处理方式存在一些奇怪/不一致的地方。具体来说,轮子存在一个错误,它使所有路径都data_files
相对于安装位置(有关跟踪此问题的问题,请参阅https://github.com/pypa/wheel/issues/92)。
“那很好”,您可能会说,“但我没有使用轮子!”。没那么快!事实证明,最新版本的 pip(我正在使用 9.0.1)甚至会尝试从源发行版编译轮子。例如,如果你有一个包,my_package
你可以看到它在做类似的事情
$ python setup.py sdist # create source tarball as dist/my_package.tar.gz
[...]
$ pip install dist/my_package.tar.gz # install the generated source
[...]
Building wheels for collected packages: my_package
Running setup.py bdist_wheel for my_package ... done
Run Code Online (Sandbox Code Playgroud)
pip
尝试提供帮助并构建一个轮子以供以后安装和缓存。这意味着即使理论上您没有使用bdist_wheel
自己,您也会遇到上述错误。您可以通过python setup.py install
直接从包源文件夹运行来解决此问题。这避免了构建和缓存构建的轮子,pip
当你想要的包已经在某个地方的 PyPI 上时,这将尝试做但非常不方便。幸运的是pip
提供了一个选项来显式禁用二进制文件。
$ pip install --no-binary :all: my_package
[...]
Skipping bdist_wheel for my_package, due to binaries being disabled for it.
Installing collected packages: my_package
Running setup.py install for my_package ... done
Successfully installed my_package-0.1.0
Run Code Online (Sandbox Code Playgroud)
使用该--no-binary
选项可防止轮子构建并让我们data_files
再次在路径中引用绝对路径。对于将大量软件包安装在一起并希望有选择地禁用轮子的情况,您可以:all:
用逗号分隔的软件包列表替换。