39

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

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

基本上我只想使用:

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

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

4

7 回答 7

50

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

from setuptools import setup, find_packages

setup(name='MySoftware',
      packages=find_packages()
)
于 2014-03-16T20:12:53.440 回答
9

介绍

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

解决方案

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

于 2019-04-09T21:12:44.293 回答
6

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

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

$猫清单.in
递归包含示例/ *.py
于 2012-06-07T02:40:39.047 回答
4

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

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

packages=find_packages()

include_package_data=True

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

recursive-include examples *

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

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

例如:排除.txt文件

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

include_package_data 您可以在此处阅读更多信息。

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

于 2016-05-10T14:08:37.277 回答
2

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

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

ipyexperiments/*py
ipyexperiments/utils/*py

无论我尝试什么, subdirutils的模块都没有包含在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

于 2019-02-23T03:55:14.993 回答
1

您可以使用以下include参数find_packages()

...
setup(name="module",
      packages=find_packages(include=('module*',)),
...
于 2021-03-16T12:31:32.810 回答
0

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

recursive-include examples/ *.py *.png *.shETC.....

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

于 2018-11-15T15:36:21.813 回答