【问题标题】:Excluding a top-level directory from a setuptools package从 setuptools 包中排除顶级目录
【发布时间】:2010-10-11 03:59:28
【问题描述】:

我正在尝试使用 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',
)

【问题讨论】:

    标签: python setuptools


    【解决方案1】:

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

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

    我们还使用 MANIFEST.in 来更好地控制 include_package_data=True 的作用。

    【讨论】:

    • 奇怪的是,使用exclude=() 对我来说还不够。根据 stackoverflow.com/a/11669299/472876 ,我必须在 MANIFEST.in 中使用 recursive-exclude tests * 才能成功。
    • @HeyWatchThis 您的tests/ 目录中有__init__.py 文件吗?也许这会有所作为?
    • 别忘了清理您的builddist*.egg-info 目录。
    【解决方案2】:

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

    【讨论】:

    • 天哪……谢谢!在这里也浪费了时间。
    • 再次,非常感谢!我浪费了整个上午试图解决这个想法。如果方式过于复杂且过于错误,那么整个打包和安装。看看所有的问题。但是修复它可能需要付出巨大的努力来设计一个全新的系统,因此我们不必拖所有这些向后兼容的废话。糟糕!
    • 就我而言,只删除*.egg-info 目录就足够了。
    • 在这上面浪费了两个小时,非常感谢您的澄清!!
    • 删除egg-info 目录做到了,天哪,我已经准备好浪费另一个晚上了!
    【解决方案3】:

    这是我在setuptools manual找到的:

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

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

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

    【讨论】:

      【解决方案4】:

      我的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
      

      我唯一需要做的就是排除我的文档目录是MANIFEST.in底部的这一行...

      prune doc*
      

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

      prune tests*
      

      【讨论】:

        【解决方案5】:

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

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

        from setuptools import setup, find_packages
        ...
        packages = find_packages(exclude=['tests']),
        data_files = os.walk(path_to_files),
        

        【讨论】:

          【解决方案6】:

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

          没用,但是:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-01-12
              • 1970-01-01
              • 1970-01-01
              • 2015-08-27
              • 2017-09-08
              • 2021-11-22
              • 2014-09-29
              • 2012-12-18
              相关资源
              最近更新 更多