我已经创建了一个名为clearplot的包,它环绕matplotlib。我还想用我的字体分发我的包。我查阅了Python打包用户指南中的this section,决定使用data_files
关键字。我选择了data_files
而不是{
这是我第一次尝试使用setup.py
文件:
from distutils.core import setup
import os, sys
import matplotlib as mpl
#Find where matplotlib stores its True Type fonts
mpl_data_dir = os.path.dirname(mpl.matplotlib_fname())
mpl_ttf_dir = os.path.join(mpl_data_dir, 'fonts', 'ttf')
setup(
...(edited for brevity)...
install_requires = ['matplotlib >= 1.4.0, !=1.4.3', 'numpy >= 1.6'],
data_files = [
(mpl_ttf_dir, ['./font_files/TeXGyreHeros-txfonts/TeXGyreHerosTXfonts-Regular.ttf']),
(mpl_ttf_dir, ['./font_files/TeXGyreHeros-txfonts/TeXGyreHerosTXfonts-Italic.ttf'])]
)
#Try to delete matplotlib's fontList cache
mpl_cache_dir = mpl.get_cachedir()
mpl_cache_dir_ls = os.listdir(mpl_cache_dir)
if 'fontList.cache' in mpl_cache_dir_ls:
fontList_path = os.path.join(mpl_cache_dir, 'fontList.cache')
os.remove(fontList_path)
这个setup.py
有两个问题:
setup()
有机会安装matplotlib之前导入它。这是一个明显的错误,但是在我运行setup()
之前,我需要知道mpl_ttf_dir
在哪里。在data_files
的绝对路径。我不认为这会是一个问题,因为我想我只会使用一个sdist分布。(sdist允许绝对路径)然后我发现pip7.0(及更高版本)将所有包转换为wheel发行版,即使发行版最初是作为sdist创建的。在我对问题2很恼火,但从那以后,我发现绝对路径是不好的,因为它们不适用于virtualenv。因此,我现在愿意改变我的方法,但是我该怎么做呢?在
我唯一的想法是首先将字体作为package_data
分发,然后使用os
模块将字体移动到适当的位置。这是一种洁净的方法吗?在
多亏了@benjaoming的回答和this blog post,我得出了以下结论:
这既解决了问题1(它在导入matplotlib之前安装它)也解决了问题2(它使用wheels)。在
我会考虑这样做。我知道您的包可能不是virtualenvs的明显候选包,但是请考虑python包可能只安装到用户可写的位置。因此,在您第一次运行程序时复制字体并检测到正确的位置,可能会提示您以比通过更有效的方式执行操作设置.py,比如:在需要时通过密码提示提升权限,如果检测不到,请求另一个位置,如果您正在重写现有的系统文件等,请提示
我曾经试图论证Python包应该能够在
/etc
中放置内容,但是我意识到与仅仅为目标操作系统创建一个合适的本机包(即debian的debian包或Windows的.exe安装程序)相比,它的好处是很小的。在底线是wheel和setuptools不是整个操作系统的包管理器,而是一些本地
site-packages/
中的包管理器。在我希望这个答案能给你足够的背景知识来避免
data_files
。最后一个好的理由是:让它在distutil、setuptools和wheel上工作是不可能的。在相关问题 更多 >
编程相关推荐