是否可以使用 dist utils (setup.py) 包含子目录作为包数据的一部分?

Posted

技术标签:

【中文标题】是否可以使用 dist utils (setup.py) 包含子目录作为包数据的一部分?【英文标题】:Is it possible to include subdirectories using dist utils (setup.py) as part of package data? 【发布时间】:2012-06-11 02:22:01 【问题描述】:

基本上我的python包是这样设置的:

module
\_examples
  \_folder1
     \_file1.py
     \_file2.py
  \_folder2
    \_file1.py
    \_file2.py

基本上我只想使用:

package_data  =  
            'module': ['examples/*'],
  ,

因为我的项目总是有人添加示例,我希望在我的应用程序中轻松列出它们。我可以让它适用于示例中的任何文件,但不能通过子目录重新诅咒。这可能吗?

【问题讨论】:

【参考方案1】:

我相信您正在寻找类似setup.py 的东西,它将递归地查找项目中的任何包,还请确保将__init__.py 文件包含到您想要的每个包的子目录中。

from setuptools import setup, find_packages

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

【讨论】:

这里要小心,因为你可能会不小心包含测试目录等,除非你明确exclude=...这些。【参考方案2】:

简介

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

解决方案

在我的包根文件夹中,我有一个setup.py 文件see doc 在这个文件中,我有以下代码:

from setuptools import setup

with open("README.md", "r") as fh:
    long_description = fh.read()

setup(
    name='package name',
    version='0.4.1',
    description='short description',
    long_description=long_description,
    long_description_content_type="text/markdown",
    url='repository url',
    author='My name',
    author_email='my@e.mail',
    license='MIT',
    packages=['PackageName','PackageName.SubModule'],
    zip_safe=False,
    install_requires=[
        'dependecy1',
    ],
    classifiers=[
        'Development Status :: 3 - Alpha',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python :: 3.7'
    ]
)

回答这个问题的有趣部分是: packages=['PackageName','PackageName.SubModule'],

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

有关所有其他参数的更多信息可以在doc 中找到。

【讨论】:

在所有的答案中,我认为这是最干净的方法【参考方案3】:

您必须为此使用MANIFEST.in 文件。

我相信你会想要这样的:

$猫清单.in 递归包含示例/ *.py

【讨论】:

我觉得你也可以直接使用setup.py中的Python函数来查找文件和目录,但是我目前还不太能找到确切的答案。 Hrm,我将不得不像我一样尝试一下:递归包含示例 *.py 并且没有使用 /。我读到 MANIFEST.in 已被弃用。我想我可能只需要遵循python函数调用方法。 哦……好吧,如果您知道如何使用 Python 进行操作,请在此处发布。我想知道。【参考方案4】:

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

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

packages=find_packages()

include_package_data=True

除此之外,您还需要一个 MANIFEST.in 文件,其内容为

recursive-include examples *

这确保递归包含所有文件。

如果您想专门排除某些扩展,可以通过在 find_packages() 参数中指定排除数组来实现。

例如:排除 .txt 文件

packages=find_packages(exclude=['.txt'])

你可以阅读更多关于include_package_datahere的信息。

还有here 是另一个链接,它告诉你什么时候不应该使用include_package_data

【讨论】:

【参考方案5】:

在类似情况下,没有一个建议的答案对我有用。

我需要使用我的包进行分发,该包在一个子目录中包含几个子模块,因此这些是我需要进入sdist 的文件:

ipyexperiments/*py
ipyexperiments/utils/*py

无论我尝试什么,子目录utils 的模块都没有包含在sdist 中。

对我有用的是保留 config.py 的默认值:

# config.py
from setuptools import setup, find_packages
[...]
setup(
    packages = find_packages(),
    [...]
)

但添加到MANIFEST.in:

# MANIFEST.in
graft ipyexperiments

ipyexperiments 下的所有内容都包括在内。

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

我也加了MANIFEST.in

prune tests
global-exclude *.py[co]

排除所有tests 目录和任何不需要的*pyc*.pyo 文件。

【讨论】:

您的MANIFEST.in 文件在哪里?在与setup.py 相同的级别或您正在制作的包的顶部? 没错。我编辑了回复以反映这一点。谢谢你的提问。【参考方案6】:

你可以利用find_packages()include参数:

...
setup(name="module",
      packages=find_packages(include=('module*',)),
...

【讨论】:

【参考方案7】:

按照 David Wolever 所说的,只是为了更清楚一点。如果您想将所有内容包含在子目录文件夹下,您必须在 MANIFEST.in 中明确指定每个文件,

recursive-include examples/ *.py *.png *.sh 等等.....

如果 manifest.in 能理解就好了 examples/ 并包括所有内容,但哦。

【讨论】:

它现在支持使用graft some-dir/包含某个路径下的所有文件。

以上是关于是否可以使用 dist utils (setup.py) 包含子目录作为包数据的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除构建产品

Gatsby - 错误:找不到模块 '..\node_modules\gatsby\dist\utils\babel-loader.js'

在构建脚本中使用 util.promisfy 无法按预期工作

是否可以使用 setup api 来判断设备是否已启用

如何在 setup.py 脚本中设置错误跟踪器 url

是否可以使用 Inno Setup 接受自定义命令行参数