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

使用setuptools在Python包中包含额外的文件,python,setuptools,Python,Setuptools,我正在尝试使用setuptools构建python控制盘。包需要包括两个文件: mymodule.py-与setup.py myjar.jar-存在于我的包目录之外的java.jar文件 我正在使用python3 setup.py bdist\u wheel构建我的包 如果我这样调用setup(): setup( name="mypkg", py_modules=["mymodule"], data_files=[('jars', ['../target/scala-

我正在尝试使用
setuptools
构建python控制盘。包需要包括两个文件:

  • mymodule.py
    -与
    setup.py
  • myjar.jar
    -存在于我的包目录之外的java.jar文件
我正在使用python3 setup.py bdist\u wheel构建我的包

如果我这样调用
setup()

setup(
    name="mypkg",
    py_modules=["mymodule"],
    data_files=[('jars', ['../target/scala-2.11/myjar.jar'])]
)
然后,
myjar.jar
成功地包含在.whl中(到目前为止还不错),但是当我
pip安装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'}
)

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

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

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

我已经为这件事焦头烂额好几个小时了,所以才来这里

我读过无数关于这方面的文章:

它建议不同组合的
数据文件
包数据
包括
包数据=True
和/或使用
清单。在
文件中,但我仍然无法按照我的意愿工作,所以我在这里希望有人能告诉我做错了什么。

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

项目目录结构:

MyProject
├ MANIFEST.in
├ mymodule.py
├ setup.py
└ myjars
    ├ __init__.py
    └ myjar.jar
清单。在
中:

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/\uuuuu init\uuuuuy.py
可能不是严格必要的,但我认为最好有它。像往常一样,一个空的
\uuuu init\uuuu.py
文件就足够了

(这假设
myjars/myjar.jar
文件在构建源发行版
sdist
之前存在。)

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

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

项目目录结构:

MyProject
├ MANIFEST.in
├ mymodule.py
├ setup.py
└ myjars
    ├ __init__.py
    └ myjar.jar
清单。在
中:

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/\uuuuu init\uuuuuy.py
可能不是严格必要的,但我认为最好有它。像往常一样,一个空的
\uuuu init\uuuu.py
文件就足够了

(这假设
myjars/myjar.jar
文件在构建源发行版
sdist
之前存在。)


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

谢谢,这帮了大忙。我不得不对我的代码进行多次重组,以匹配您文章中的结构,现在它可以工作了。我现在一点一点地解开它,把它移回我想要的结构,看看它在哪里断裂。一个关键的区别是我的代码只包含一个模块,而不是一个包。让我们看看我能不能让它工作。我明白了。基本上你应该从你展示的最后一个例子(第五个)开始。谢谢,这很有帮助。我不得不对我的代码进行多次重组,以匹配您文章中的结构,现在它可以工作了。我现在一点一点地解开它,把它移回我想要的结构,看看它在哪里断裂。一个关键的区别是我的代码只包含一个模块,而不是一个包。让我们看看我能不能让它工作。我明白了。基本上你应该从你展示的最后一个例子(第五个)开始。是的!成功了,非常感谢。当然,关于符号链接你也是对的,所以我创建了它。是的!成功了,非常感谢。当然,关于符号链接你也是对的,所以我创建了它。