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

时间:2012-06-07 02:30:25

标签: python install distutils setup.py

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

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

基本上我想使用:

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

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

7 个答案:

答案 0 :(得分:37)

我相信你正在寻找的是setup.py这样的东西,它会递归地找到项目中的任何包,同时也要确保将__init__.py个文件包含到子目录中你想要的包裹。

from setuptools import setup, find_packages

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

答案 1 :(得分:3)

您必须使用MANIFEST.in文件。

我相信你会想要这样的事情:

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

答案 2 :(得分:3)

简介

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

解决方案

在程序包的根文件夹中,有一个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 :(得分: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

答案 4 :(得分:0)

下面是大卫·沃尔沃(David Wolever)所说的,只是为了使它更清楚一点。如果要将所有内容都包含在子目录文件夹下,则必须在MANIFEST.in中明确指定每个文件,

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

如果manifest.in能够理解,那就太好了 examples/并包含所有内容,但是哦。

答案 5 :(得分: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文件。

答案 6 :(得分:0)

您可以使用 includefind_packages() 参数:

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