使用 setuptools 在 Python 包中包含额外文件

include extra file in a Python package using setuptools

我正在尝试使用 setuptools 构建一个 python 轮子。软件包需要包含两个文件:

我正在使用 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 它将罐子放在 /usr/local/myjar.jarthis 有点解释为什么)这根本不是我想要的,我希望它与 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_filespackage_datainclude_package_data=True and/or 使用 Manifest.in 文件的不同组合,但我仍然无法正常工作正如我所愿,所以我在这里希望有人可以建议我做错了什么。

数据文件(在那种情况下 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 脚本或任何东西的一部分像那样。在 setup.py 中,可能有一些方法可以作为自定义 setuptools 命令的一部分进行复制,但我认为这不值得付出努力,实际上它不是 setup.py的工作。