【问题标题】:include extra file in a Python package using setuptools使用 setuptools 在 Python 包中包含额外文件
【发布时间】:2020-08-20 18:08:20
【问题描述】:

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

  • mymodule.py - 与 setup.py 在同一目录中的 python 模块
  • myjar.jar - 一个存在于我的包目录之外的 java .jar 文件

我正在使用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 和/或使用Manifest.in 文件的不同组合,但我仍然无法按我的意愿工作,所以我在这里希望有人可以建议我做错了什么。

【问题讨论】:

  • 谢谢,帮了大忙。我不得不大量重组我的代码以匹配您文章中的结构,现在它可以工作了。我现在一点一点地拆开它,把它移回我想要的结构,看看它在哪里断裂。一个关键的区别是我的代码只包含一个模块,而不是一个包。让我们看看我能不能让它工作。
  • 我明白了。基本上你应该从你展示的最后一个例子(第 5 个)开始。

标签: python setuptools


【解决方案1】:

数据文件(在这种情况下为 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 工作的一部分。

【讨论】:

  • 是的!做到了,非常感谢。当然,您对符号链接也是正确的,所以我创建了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2012-08-04
  • 2018-09-09
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多