Python 是否可以将使用dist-utils(setup.py)的子目录作为包数据的一部分包括在内?

Python 是否可以将使用dist-utils(setup.py)的子目录作为包数据的一部分包括在内?,python,installation,distutils,setup.py,Python,Installation,Distutils,Setup.py,基本上,我的python包的设置如下: module \_examples \_folder1 \_file1.py \_file2.py \_folder2 \_file1.py \_file2.py 基本上我只想使用: package_data = { 'module': ['examples/*'], }, 因为我的项目总是有人在添加示例,我希望可以很容易地从我的应用程序中列出它们。我可以让它适用于示例中的任何

基本上,我的python包的设置如下:

module
\_examples
  \_folder1
     \_file1.py
     \_file2.py
  \_folder2
    \_file1.py
    \_file2.py
基本上我只想使用:

package_data  = { 
            'module': ['examples/*'],
  },
因为我的项目总是有人在添加示例,我希望可以很容易地从我的应用程序中列出它们。我可以让它适用于示例中的任何文件,但不能通过子目录进行重新命名。这可能吗?

您必须使用一个文件来实现这一点

我相信你会想要这样的东西:

$ cat MANIFEST.in recursive-include examples/ *.py $cat.in 递归包含示例/*.py
我相信您正在寻找的是类似于此的
setup.py
,它将递归地查找项目中的任何包,也请确保将
\uuuuuu init\uuuuuuuuuu.py
文件包含到您想要的每个包的子目录中

from setuptools import setup, find_packages

setup(name='MySoftware',
      packages=find_packages()
)

是的,您可以包括所有子目录

只需将以下参数传递给setup()函数:

packages=find_packages()

include_package_data=True
除此之外,您还需要有一个MANIFEST.in文件,其内容如下所示

recursive-include examples *
这样可以确保递归地包含所有文件

如果要明确排除某些扩展,可以在
find\u packages()
参数中指定exclude array

例如:排除
.txt
文件

packages=find_packages(exclude=['.txt'])
您可以阅读更多关于
包含\u包\u数据的信息


另外还有一个链接,告诉你什么时候不应该使用
include\u package\u data

跟随David Wolever的话,只是为了让它更清楚一点。如果要包含子目录文件夹下的所有内容,必须在MANIFEST.in中明确指定每个文件

递归包含示例/*.py*.png*.sh

如果manifest.in能理解那就太好了
示例/
并包括所有内容,但不包括oh well

在类似的情况下,所有建议的答案都不适用于我

我需要用我的软件包进行分发,其中包括子目录中的几个子模块,以便这些是我需要进入
sdist
的文件:

ipyexperiments/*py
ipyexperiments/utils/*py
不管我怎么做,subdir
utils
的模块都没有包含在
sdist

对我有效的方法是保留
config.py
的默认设置:

# config.py
from setuptools import setup, find_packages
[...]
setup(
    packages = find_packages(),
    [...]
)
但是添加到
清单中。在
中:

# MANIFEST.in
graft ipyexperiments
包括
ipyexperiments
下的所有内容

如果您在
中还没有
清单,请在与
config.py
相同的目录中创建它

我还添加了
MANIFEST.in

prune tests
global-exclude *.py[co]
排除所有
测试
目录和任何不需要的
*pyc
*.pyo
文件。

简介 我看到这篇文章,花了一些时间研究如何将特定的子模块添加到我的包中,所以我将在这里发布我的解决方案

解决方案 在我的包根文件夹中,我有一个
setup.py
文件
在此文件中,我有以下代码:

从设置工具导入设置
以open(“README.md”、“r”)作为fh:
long_description=fh.read()
设置(
name='package name',
version='0.4.1',
description='short description',
长描述=长描述,
长\u描述\u内容\u type=“text/markdown”,
url='repository url',
作者:'我的名字',
作者(电邮地址)my@e.mail',
许可证,
packages=['PackageName','PackageName.SubModule'],
zip_safe=False,
安装所需的=[
“dependcy1”,
],
分类器=[
“发展状况:3-阿尔法”,
“许可证::OSI已批准::麻省理工许可证”,
'编程语言::Python::3.7'
]
)
回答这个问题的有趣部分是:
packages=['PackageName','PackageName.SubModule',

通过遵循此语法,您可以将子模块包括到主包分发中


有关所有其他参数的更多信息,请参见。

您可以使用
find\u packages()
include
参数:

。。。
设置(name=“module”,
包=查找包(包括=('module*',),
...

我认为您也可以直接使用setup.py中的Python函数来查找文件和目录,但目前我还没有找到确切的答案。Hrm,我必须像以前一样尝试一下:recursive include examples*.py,但没有使用/.I read该MANIFEST.in。尽管如此,我还是不赞成使用该MANIFEST.in。我想我可能不得不遵循python function call method.噢…好吧,如果你想知道如何使用Python,请在这里发布。我想知道。在这里要小心,因为你可能会意外地包括测试目录等。除非你明确地
exclude=…
这些。你的
清单.in
文件在哪里运行?与
setup.py
或您正在制作的包的顶部?没错。我编辑了回复以反映这一点。谢谢您的提问。它确实支持现在使用
graft some dir/
将特定路径下的所有文件包括在内。