上安装配置文件复制上安装配置文件复制(Copy configuration file on inst

2019-05-12 11:27发布

我想我的打包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目录,就在源文件所在的位置。

我如何能实现我在寻找什么呢?

Answer 1:

这是一个问题,我曾经去体验自己。 究其根源是,当你正在建设一个轮子的文件,所有在指定的绝对路径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()


Answer 2:

况且什么@hoefling说,我建议你不要使用data_files了! 因为它是真正不可预测的,其中的文件将被复制到。 您可以通过给目录类似测试这个'''/' ,或'/anything/you/want'

我建议你使用package_data相反,这只是复制上安装分布式包的根目录下的文件。 然后,你可以复制到任何你想要在运行时。

欲了解更多关于package_data ,请参阅Python的文件https://docs.python.org/2/distutils/setupscript.html#installing-package-data



文章来源: Copy configuration file on installation