42

我正在尝试使用 setuptools 将 Python 项目放入 tarball。问题是 setuptools 似乎不喜欢最初设置源树的方式(不是我,我必须添加)。我真正想要分发的所有内容都在顶级目录中,而不是像 setuptools 文档所说的那样在子目录中。

树有一个目录,tests,我不想在发布的包中拥有它。但是,使用exclude_package_data似乎并没有真正做任何排除,我想弄清楚我做错了什么。

setup.py看起来像这样,在相关部分:

setup(
  name="project",
  packages=[''],
  include_package_data=True,
  exclude_package_data={'': ['tests']},
  test_suite='nose.collector',
)
4

7 回答 7

31

我们使用以下约定从包中排除“测试”。

setup(
   name="project",
   packages=find_packages(exclude=("tests",)),
   include_package_data=True, 
   test_suite='nose.collector',
)

我们还使用 MANIFEST.in 来更好地控制做什么include_package_data=True

于 2012-03-19T11:59:20.953 回答
30

我在同一个问题上浪费了几个小时,试图排除一个模块,我终于发现我必须删除*.egg-infoandbuild目录,这以某种方式保留了必须包含模块的想法。

于 2020-01-10T17:21:34.203 回答
19

这是我在setuptools 手册中找到的:

from setuptools import setup, find_packages
...
packages = find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),

在我的情况下,以下内容足以排除顶级测试目录:

packages = find_packages(exclude=["tests.*", "tests"]),
于 2015-09-22T20:38:46.450 回答
13

我在我的setup.py...

setup(name='pyfoo',
      version="1.0.2",
      description='Example for stack overflow',
      url='http://stackoverflow.com/',
      author='David Michael Pennington',
      author_email='mike /|at|\ pennington.net',
      license='GPL',
      platforms='any',
      keywords='Stack Overflow Example',
      entry_points = "",
      long_description=read('README.rst'),
      include_package_data=True,  # Checks MANIFEST.in for explicit rules
      #                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      packages=find_packages(),
      use_2to3=True,
      zip_safe=False,
      setup_requires=["setuptools_hg"],

我有一个doc/目录,由于其中包含的图像数量而变得庞大;这意味着我的大小sdist正在增长超过 500kB。原来我有这个在我的MANIFEST.in...

include LICENSE CHANGES README.rst requirements.txt
recursive-exclude * __pycache__
recursive-exclude * *.pyc
recursive-exclude * *.pyo
recursive-exclude * *.orig

为了排除我的 doc 目录,我唯一要做的就是MANIFEST.in...底部的这一行

prune doc*

使用prune doc*突然doc/从压缩包中删除了我的所有目录sdist。所以,看起来你只需要在MANIFEST.in文件中使用它......

prune tests*
于 2015-02-01T20:11:07.853 回答
7

呃,setuptools 让这变得非常棘手:(

我不知道这是否是您想要的,但我从事的一个项目结合了两件事:

from setuptools import setup, find_packages
...
packages = find_packages(exclude=['tests']),
data_files = os.walk(path_to_files),
于 2009-03-04T02:41:14.563 回答
2

在我的情况下有效的附加解决方案。显然:packages=setuptools.find_packages(exclude=["tests.*", "tests"]),

没用,但是:

packages=setuptools.find_packages(exclude=["*tests.*", "*tests"]),

在单词的开头添加星号就可以了。

于 2020-09-16T13:17:56.733 回答
1

为了类似的目的,我的同事写了 setuptools-dummy 包:http: //github.com/ella/setuptools-dummy/tree/master

看看 setuptools_dummy,根据您的需要修改排除项,它应该可以工作。如果没有,请打开一个问题;)

于 2009-06-16T10:33:39.850 回答