如何将 data_files 安装到绝对路径?

Gre*_*urm 4 python pip

我使用 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)

avi*_*gil 6

简短回答:用于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:用逗号分隔的软件包列表替换。