data_files pip和setuptools之间的差异

时间:2015-08-03 12:59:03

标签: python-3.x install pip setuptools data-files

我有一个带有setup.py脚本的Python应用程序,可以通过Pip或setuptools安装。但是,我发现这两种方法之间存在一些恼人的差异,我想知道正确分发数据文件的方式

import glob
import setuptools

long_description = ''
setuptools.setup(
  name='creator-build',
  version='0.0.3-dev',
  description='Meta Build System for Ninja',
  long_description=long_description,
  author='Niklas Rosenstein',
  author_email='rosensteinniklas@gmail.com',
  url='https://github.com/creator-build/creator',
  py_modules=['creator'],
  packages=setuptools.find_packages('.'),
  package_dir={'': '.'},
  data_files=[
    ('creator', glob.glob('creator/builtins/*.crunit')),
  ],
  scripts=['scripts/creator'],
  classifiers=[
    "Development Status :: 5 - Production/Stable",
    "Programming Language :: Python",
    "Intended Audience :: Developers",
    "Topic :: Utilities",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
    ],
  license="MIT",
)
  1. 使用点数data_files中指定的文件最终会显示在sys.prefix + '/creator'
  2. 使用 setuptools (即直接运行setup.py),文件最终会显示在lib/python3.4/site-packages/creator_build-0.0.3.dev0-py3.4.egg/creator
  3. 理想情况,我希望这些文件始终位于同一位置,与安装方法无关。我也更喜欢将文件放入模块目录(setuptools的方式),但如果软件包安装为压缩的Python Egg ,则可能导致问题。

    如何确保data_files在两种安装方法中都位于同一位置?另外,我怎么知道我的模块是否作为压缩的Python Egg 安装,如何加载数据文件呢?

1 个答案:

答案 0 :(得分:0)

我一直在问,包括official docs在内的普遍共识是:

不建议使用data_files。它不适用于车轮,因此应避免使用。

相反,每个人似乎都指向include_package_data
这里有一个缺点,就是不允许包含src根目录之外的内容。这意味着,如果creatorcreator-build之外,则不会包含它。甚至package_data也会有此限制。

如果您的数据文件不在源文件之外,则是唯一的解决方法(例如,出于很多我们不需要讨论的原因,我正尝试包含examples/*.py,您可以将它们热插拔,进行设置,然后将其删除。

import setuptools, glob, shutil

with open("README.md", "r") as fh:
    long_description = fh.read()

shutil.copytree('examples', 'archinstall/examples')

setuptools.setup(
    name="archinstall",
    version="2.0.3rc4",
    author="Anton Hvornum",
    author_email="anton@hvornum.se",
    description="Arch Linux installer - guided, templates etc.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/Torxed/archinstall",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3.8",
        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
        "Operating System :: POSIX :: Linux",
    ],
    python_requires='>=3.8',
    package_data={'archinstall': glob.glob('examples/*.py')},
)

shutil.rmtree('archinstall/examples')

这虽然很难看,但可以。
我的文件夹结构供参考(在git repo中):

.
├── archinstall
│   ├── __init__.py
│   ├── lib
│   │   ├── disk.py
│   │   └── exceptions.py
│   └── __main__.py
├── docs
│   ├── logo.png
├── examples
│   ├── guided.py
│   └── minimal.py
├── LICENSE
├── profiles
│   ├── applications
│   │   ├── awesome.json
│   │   ├── gnome.json
│   │   ├── kde.json
│   │   └── postgresql.json
│   ├── desktop.py
│   ├── router.json
│   ├── webserver.json
│   └── workstation.json
├── README.md
└── setup.py

这是我可以看到如何包括例如profilesexamples而不将它们移出存储库根目录之外的唯一方法(我更喜欢不这样做,因为我希望用户导航到github上的存储库时可以轻松找到它们。

最后一点。如果您不介意污染src目录,在我的情况下就是archinstall。您可以符号链接任何需要包含的内容,而不必复制它。

cd archinstall
ln -s ../examples ./examples
ln -s ../profiles ./profiles

这样,当安装setup.pypip时,它们将以<package dir>的根目录结尾。