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安装进行安装…
    似乎根本不会调用复制
  • 使用
    python setup.py安装进行安装
    在我的机器上运行良好,但ReadTheDocs给了我以下错误:

    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)