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

niwlg2el  于 2023-01-08  发布在  Python
关注(0)|答案(8)|浏览(79)

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

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

基本上我只想用途:

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

因为我的项目总是有人添加例子,我希望它能很容易地从我的应用程序中列出他们。我可以让它在例子中的任何文件工作,但不通过子目录重新诅咒下来。这可能吗?

q7solyqu

q7solyqu1#

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

from setuptools import setup, find_packages

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

mrphzbgm2#

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

jgwigjjp

jgwigjjp3#

为此,您必须使用MANIFEST.in文件。
我相信你会想要这样的东西:

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

vptzau2j4#

可以,您可以包括所有子目录。
您只需要将以下参数传递给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_datahere的信息。
另外,here是另一个链接,它告诉您何时不应使用include_package_data

ubby3x7f

ubby3x7f5#

在类似的情况下,没有一个建议的答案对我有效。
我需要对我的包进行分发,它在一个子目录中包含了几个子模块,因此这些文件就是我需要进入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

# MANIFEST.in
graft ipyexperiments

ipyexperiments下的所有内容都包括在内。
如果您还没有MANIFEST.in,请在与config.py相同的目录中创建它。
我还向MANIFEST.in添加了

prune tests
global-exclude *.py[co]

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

mlmc2os5

mlmc2os56#

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

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

9fkzdhlc7#

按照大卫Wolever所说的,只是为了让它更清楚一点,如果你想包含一个子目录文件夹下的所有内容,你必须显式地指定www.example.com中的每个文件MANIFEST.in,
recursive-include examples/ *.py *.png *.sh等.....
如果manifest.in能理解examples/并包括所有内容,那就太好了。

khbbv19g

khbbv19g8#

所有其他答案似乎都很复杂。这适用于版本9.3.15:

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

注意**而不是*。任何文件夹中都不需要__init__.py

相关问题