Python 安装期间复制配置文件的正确方法?
我正在尝试分发我编写的Python 安装期间复制配置文件的正确方法?,python,matplotlib,setuptools,Python,Matplotlib,Setuptools,我正在尝试分发我编写的mplstyle,以便能够轻松地共享。它归结为在安装过程中将文本文件复制到正确的配置方向(这对于任何体系结构都是已知的)。我希望能够使用python setup.py安装或pip安装…进行安装。目前,我似乎无法获得这两种方法中的任何一种(参见下面的当前方法) 使用pip安装进行安装…似乎根本不会调用复制 使用python setup.py安装进行安装在我的机器上运行良好,但ReadTheDocs给了我以下错误: python setup.py install --forc
mplstyle
,以便能够轻松地共享。它归结为在安装过程中将文本文件复制到正确的配置方向(这对于任何体系结构都是已知的)。我希望能够使用python setup.py安装
或pip安装…
进行安装。目前,我似乎无法获得这两种方法中的任何一种(参见下面的当前方法)
- 使用
似乎根本不会调用复制pip安装进行安装…
- 使用
在我的机器上运行良好,但ReadTheDocs给了我以下错误:python setup.py安装进行安装
python setup.py install --force running install error: [Errno 2] No such file or directory: u'/home/docs/.config/matplotlib/stylelib/goose.mplsty
setup.py
goosempl/\uuuuu init\uuuuuu.py
上传到PyPi
首先,根据您提供的项目结构,您没有正确指定
package\u数据。如果goosempl
是一个包,并且stylelib
是其中包含mplstyle
文件的目录(我从您的代码中假设的),那么您的package\u数据
配置行应该是:
package_data = {'goosempl': ['stylelib/goose.mplstyle']},
如中所述:
package\u data
参数是一个从包名映射到全局模式列表的字典。如果数据文件包含在包的子目录中,则globs可能包含子目录名
因此,您的包是goosempl
和stylelib/goose。mplstyle
是要包含在goosempl
的包数据中的文件
您的第二个问题(没有这样的文件或目录
)很简单:在copy_style()
函数中,您在写入文件之前从不检查文件的父目录是否存在。您应该能够通过删除目录/home//.config/matplotlib/stylelib/
(或临时移动)在本地复制该文件
修复也很简单,实际上有很多。使用您想要创建的任何缺少的目录
- 适用于
python2
和python3
:
for fname in files:
path = os.path.join(matplotlib.get_configdir(), fname)
distutils.dir_util.mkpath(os.dirname(path))
- 我的首选是使用,但它只有在Python 3.4之后才可用:
for fname in files:
path = pathlib.Path(matplotlib.get_configdir(), fname)
path.parent.mkdir(parents=True, exist_ok=True)
谢谢,这解决了我的大部分问题。最后我使用了os
:如果不是os.path.isdir(os.path.dirname(path)):os.makedirs(os.path.dirname(path))
(注意我这边的小错误)。然而,它似乎无法解决pip的问题。使用pip从PyPi安装似乎不会调用PostInstallCommand
命令。(仅在上传到PyPi之前在我的机器上调用它。)install
命令不会被pip
调用。根据设计,它不是从源代码安装的。相反,它构建了一个控制盘并从中安装—但是wheel
格式不使用安装脚本—它甚至不包含它。所以不会调用您的PostInstallCommand
。好的,我明白了。使用pip
安装时是否有方法复制这些配置文件?我知道可以只包含复制命令,以便在包含库时始终调用它,但这并不是我想要的,因为(I)这会导致不必要的反复检查,以及(ii)在我的特定情况下,我希望用户加载样式,不需要包含库。不幸的是,在您的情况下,没有-您希望将文件放置在站点包
目录之外,而控制盘
不允许这样做。请参阅my以回答一个类似的问题—OP希望在安装时在用户的主目录中放置一个配置文件。唯一的解决方法是首先不要构建控制盘,而是构建源tar/zip/bz2,并在安装时告诉pip
不要使用--无二进制
标志从源发行版构建控制盘。
python setup.py bdist_wheel --universal
twine upload dist/*
package_data = {'goosempl': ['stylelib/goose.mplstyle']},
for fname in files:
path = os.path.join(matplotlib.get_configdir(), fname)
distutils.dir_util.mkpath(os.dirname(path))
for fname in files:
path = pathlib.Path(matplotlib.get_configdir(), fname)
path.parent.mkdir(parents=True, exist_ok=True)