在安装时复制配置文件
我正在尝试打包我的Python项目,该项目带有一个配置点文件,我想在安装时将其复制到用户的主目录中。快速包装指南指出,可以使用的data_files
参数来完成此操作setuptools.setup
。这就是我所拥有的:
data_files = [(os.path.expanduser("~"), [".my_config"])]
如果使用python setup.py install
,这似乎可以正常工作,但是当我将程序包上传到PyPI并运行时pip
install
,不会复制dotfile。
FWIW,我将点文件放在中MANIFEST.in
,还尝试包含的package_data
参数setup
。这些步骤似乎都不起作用。如果我pip
install
在site-packages
目录中四处张望,则仅源文件在此处。
我如何才能找到想要的?
-
这是我曾经经历过的一个问题。它的根源在于,当您构建一个wheel文件时,在其中指定的所有绝对路径
data_files
都将相对于目标site- packages
目录,请参见github上的此问题。通过进行该影响安装pip install
,因为它会建立一个车轮的任何源包的(.tar.gz
,.tar.bz2
或.zip
),并安装所得到的车轮:$ pip install spam-0.1.tar.gz Processing ./spam-0.1.tar.gz **Building wheels for collected packages: spam Running setup.py bdist_wheel for spam ... done** Stored in directory: /Users/hoefling/Library/Caches/pip/wheels/d0/95/be/bc79f1d589d90d67139481a3e706bcc54578fdbf891aef75c0 Successfully built spam Installing collected packages: spam Successfully installed spam-0.1
检查已安装的文件会产生:
$ pip show -f spam Name: spam Version: 0.1 ... Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages Requires: Files: **Users/hoefling/.my_config** spam-0.1.dist-info/DESCRIPTION.rst spam-0.1.dist-info/INSTALLER spam-0.1.dist-info/METADATA spam-0.1.dist-info/RECORD spam-0.1.dist-info/WHEEL spam-0.1.dist-info/metadata.json spam-0.1.dist-info/top_level.txt
请注意,绝对路径是相对于
Location
目录的。在示例中,.my_config
将放置在下/Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site- packages/Users/hoefling/.my_config
。效果会更好,因为这些内置轮子已缓存在磁盘上,因此,下次重新安装软件包时,内置轮子仍存在于
pip
的缓存中,它将用于安装,甚至看不到任何有关构建的提示。终端日志中的滚轮。没有真正的解决方案可以避免这种情况。我发现,最体面的解决方法是在安装时禁止“二进制”软件包以在安装时强制执行软件包
setup.py
:$ pip install spam-0.1.tar.gz --no-binary=spam Processing ./spam-0.1.tar.gz Skipping bdist_wheel for spam, due to binaries being disabled for it. Installing collected packages: spam Running setup.py install for spam ... done Successfully installed spam-0.1
现在,该文件已正确放置:
$ pip show -f spam Name: spam Version: 0.1 ... Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages Requires: Files: ../../../../../.my_config spam-0.1-py3.6.egg-info/PKG-INFO spam-0.1-py3.6.egg-info/SOURCES.txt spam-0.1-py3.6.egg-info/dependency_links.txt spam-0.1-py3.6.egg-info/top_level.txt
不幸的是,必须
pip install
使用附加键(通过自述文件,网页FAQ或类似方法)分别告知用户有关使用附加键进行呼叫的信息,因为不可能禁止在打包元数据中构建轮子。结果,我不再包含具有绝对路径的文件。相反,我将它们与
site- packages
dir中的python源一起安装。在python代码中,如有必要,我必须为存在性检查和文件复制添加其他逻辑:# program entrypoint if __name__ == '__main__': config = os.path.join(os.path.expanduser('~'), '.my_config') if not os.path.exists(config): shutil.copyfile('.my_config', config) main.run()