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

问题描述 投票:26回答:6

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

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

基本上我只想使用:

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

因为我的项目总是让人们添加示例,我希望从我的应用程序中轻松列出它们。我可以在示例中为任何FILE工作,但不能通过子目录重新编译。这可能吗?

python install distutils setup.py
6个回答
37
投票

我相信你正在寻找的是你的setup.py,它会以递归的方式找到项目中的任何软件包,同时也要确保将__init__.py文件包含在你想要的每个软件包的子目录中。

from setuptools import setup, find_packages

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

4
投票

你必须使用MANIFEST.in文件。

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

$ cat MANIFEST.in
recursive-include examples/ *.py

3
投票

Introduction

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

Solution

在我的包根文件夹中,我有一个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='[email protected]',
    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中找到。


1
投票

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

你只需要将下面的args传递给setup()函数:

packages=find_packages()

include_package_data=True

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

recursive-include examples *

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

如果要特定地排除某些扩展,可以通过在find_packages()参数中指定exclude array来实现。

例如:排除.txt文件

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

您可以阅读更多关于include_package_data here的内容。

此外,here是另一个链接,告诉你何时不应该使用include_package_data


0
投票

遵循David Wolever所说的,只是为了让它更加清晰。如果要包含子目录文件夹下的所有内容,则必须在MANIFEST.in中明确指定每个文件,

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

如果manifest.in只是理解examples/并包含一切,那就太好了。


0
投票

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

我需要使用我的包进行分发,其中包含子目录中的几个子模块,因此这些是我需要进入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

prune tests
global-exclude *.py[co]

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

© www.soinside.com 2019 - 2024. All rights reserved.