我想我的打包Python项目,它附带了一个我想复制到上安装的用户的主目录的配置dotfile。 快速指南包装说,这可以用做data_files
参数setuptools.setup
。 因此,这是我有:
data_files = [(os.path.expanduser("~"), [".my_config"])]
这似乎如果我用做工精细python setup.py install
,但是当我上传我的包的PyPI和运行pip install
的dotfile是不可复制的。
FWIW,我已经把dotfile在MANIFEST.in
也试图包括package_data
参数setup
。 这些措施都没有出现有所作为。 如果我pip install
和周围的捅site-packages
目录,就在源文件所在的位置。
我如何能实现我在寻找什么呢?
这是一个问题,我曾经去体验自己。 究其根源是,当你正在建设一个轮子的文件,所有在指定的绝对路径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
目录。 在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()
况且什么@hoefling说,我建议你不要使用data_files
了! 因为它是真正不可预测的,其中的文件将被复制到。 您可以通过给目录类似测试这个''
, '/'
,或'/anything/you/want'
。
我建议你使用package_data
相反,这只是复制上安装分布式包的根目录下的文件。 然后,你可以复制到任何你想要在运行时。
欲了解更多关于package_data
,请参阅Python的文件https://docs.python.org/2/distutils/setupscript.html#installing-package-data