我有一个带有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",
)
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 安装,如何加载数据文件呢?
答案 0 :(得分:0)
我一直在问,包括official docs在内的普遍共识是:
不建议使用data_files。它不适用于车轮,因此应避免使用。
相反,每个人似乎都指向include_package_data
。
这里有一个缺点,就是不允许包含src
根目录之外的内容。这意味着,如果creator
在creator-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上的存储库时可以轻松找到它们。。
最后一点。如果您不介意污染src
目录,在我的情况下就是archinstall
。您可以符号链接任何需要包含的内容,而不必复制它。
cd archinstall
ln -s ../examples ./examples
ln -s ../profiles ./profiles
这样,当安装setup.py
或pip
时,它们将以<package dir>
的根目录结尾。