首页 > 解决方案 > 使用 setuptools 在 Python 包中包含额外文件

问题描述

我正在尝试使用setuptools. 该包需要包含两个文件:

我正在使用python3 setup.py bdist_wheel.

如果我setup()这样打电话:

setup(
    name="mypkg",
    py_modules=["mymodule"],
    data_files=[('jars', ['../target/scala-2.11/myjar.jar'])]
)

然后myjar.jar确实成功包含在 .whl 中(到目前为止很好)但是当我pip install mypkg将 jar 放在/usr/local/myjar.jar有点解释为什么)这根本不是我想要的时,我希望它存在于同一个地方mymodule.py,即/usr/local/lib/python3.7/site-packages/

如果我setup.py改为

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': '../target/scala-2.11/myjar.jar'}
)

或者

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': ['../target/scala-2.11/myjar.jar']}
)

然后myjar.jar根本不会包含在.whl 中。我尝试复制myjar.jar到同一目录并更改setup.py为:

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': 'myjar.jar'}
)

或者

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': ['myjar.jar']}
)

但仍然myjar.jar没有包含在 .whl 中。

我已经为此扯了几个小时的头发,这就是我在这里的原因。

我已经阅读了无数关于此的 SO 帖子:

这建议了,和/或文件的不同组合data_files,但我仍然无法按照我的意愿工作,所以我在这里希望有人能告诉我我做错了什么。package_datainclude_package_data=TrueManifest.in

标签: pythonsetuptools

解决方案


数据文件(在这种情况下myjar.jar)实际上应该是包数据文件,因此它们应该是 Python 包的一部分。因此,在父目录中包含此类文件会使事情变得更加复杂,但可能并非不可能。所以让我们从一个更简单的例子开始。我相信像下面这样的东西应该工作......

项目目录结构:

MyProject
├ MANIFEST.in
├ mymodule.py
├ setup.py
└ myjars
    ├ __init__.py
    └ myjar.jar

MANIFEST.in

recursive-include myjars *.jar

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='MyProject',
    version='1.2.3',
    #
    include_package_data=True,
    packages=['myjars'],
    py_modules=["mymodule"],
)

myjars/__init__.py可能不是绝对必要的,但我相信拥有它会更好。和往常一样,一个空__init__.py文件就足够好了。

(这假定该myjars/myjar.jar文件在构建源分发之前就存在。) sdist

至于处理父目录中的数据文件,我的建议是在调用之前简单地复制(或符号链接)这些文件setup.py,可能作为 shell 脚本的一部分或类似的东西。可能有一些方法可以将复制作为自定义setuptools命令的一部分setup.py,但在我看来,这不值得付出努力,实际上这不是setup.py's 工作的一部分。


推荐阅读