使用 setuptools 在 Python 包中包含额外文件
include extra file in a Python package using setuptools
我正在尝试使用 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.jar
(this 有点解释为什么)这根本不是我想要的,我希望它与 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 帖子:
- How to include package data with setuptools/distribute?
- MANIFEST.in ignored on "python setup.py install" - no data files installed?
- How do you add additional files to a wheel?
建议 data_files
、package_data
、include_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
的工作。
我正在尝试使用 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.jar
(this 有点解释为什么)这根本不是我想要的,我希望它与 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 帖子:
- How to include package data with setuptools/distribute?
- MANIFEST.in ignored on "python setup.py install" - no data files installed?
- How do you add additional files to a wheel?
建议 data_files
、package_data
、include_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
的工作。