gpt4 book ai didi

python-3.x - pip 和 setuptools 之间的 data_files 差异

转载 作者:行者123 更新时间:2023-12-03 17:42:53 25 4
gpt4 key购买 nike

我有一个带有 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",
)
  • 使用 pip data_files 中指定的文件最终出现在 sys.prefix + '/creator' .
  • 使用 设置工具 (即直接运行setup.py),文件以lib/python3.4/site-packages/creator_build-0.0.3.dev0-py3.4.egg/creator结束.

  • 理想情况下 ,我希望文件始终位于同一位置,与安装方法无关。我还希望将文件放入模块目录(setuptools 的方式),但如果将包安装为压缩的 Python Egg,则可能会导致问题。

    我怎样才能确定 data_files两种安装方法最终在同一个位置?另外,我怎么知道我的模块是否安装为压缩的 Python Egg,然后如何加载数据文件?

    最佳答案

    我一直在四处打听,包括 official docs 在内的普遍共识就是它:

    Warning data_files is deprecated. It does not work with wheels, so it should be avoided.


    相反,每个人似乎都指向 include_package_data。反而。
    这里有一个缺 pip ,它不允许包含您的 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
    这是我可以看到如何包含例如我的 profiles 的唯一方法以及 examples无需将它们移出存储库的根目录(我不想这样做,因为我希望用户在导航到 github 上的存储库时轻松找到它们)。
    最后一 pip 。如果您不介意污染 src目录,在我的情况下,这只是 archinstall .您可以在需要包含的任何内容中进行符号链接(symbolic link),而不是复制它。
    cd archinstall
    ln -s ../examples ./examples
    ln -s ../profiles ./profiles
    这样,当 setup.pypip安装它,它们最终会出现在 <package dir>因为它是根。

    关于python-3.x - pip 和 setuptools 之间的 data_files 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31787983/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com