setuptools麻烦 - 不包括包,包括数据文件

时间:2011-12-19 04:06:24

标签: python configuration setuptools

我是setuptools的新手。我已经看到了一些类似的问题而且它有点疯狂,我似乎遵循了我看到的建议但是setuptools仍然做了与我想要的不同的事情。

这是我项目的结构:

.
..
package1/
    __init__.py
    abc.py
    ...
tests/
    __init__.py
    test_package1.py
LICENSE
README.md
RELEASE
setup.py

以下是我的setup.py:

的内容
#!/usr/bin/env python
import os
#from distutils.core import setup
from setuptools import setup, find_packages

setup(
    name='package1',
    version='1.1',
    test_suite="tests",
    packages=find_packages(exclude=['tests']),    
    include_package_data=True,
    package_data = {
        '': ['LICENSE', 'README.md5', 'RELEASE']
    },   
)

另外,在我的清单文件中,我有:

include LICENSE
include RELEASE
include README.md

我用以下内容构建tar:

python setup.py sdist

我想:

  1. 从源代码发布中排除tests目录;
  2. 在site-packages目录中有LICENSE,README.md,RELEASE文件,位于顶层或package1目录内(此时我同意)。
  3. 相反,这是发生的事情:

    1. tests目录仍然在创建的tar存档中并安装到site-packages;
    2. 文件将复制到存档,但不会安装到软件包的站点打包目录中。
    3. 我没有想法,有人可以向我解释我做错了什么以及如何解决它?

5 个答案:

答案 0 :(得分:21)

find_packages使用fnmatchcase进行排除过滤。您可以测试排除模式是否与包名称匹配,如下所示:

>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False

假设项目中的所有测试都存在于以tests结尾的包名或这些包的子包中,以下内容应足以排除所有测试代码:

setup(
    name='package1',
    version='1.1',
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),    
)

要从源发行版中排除tests文件夹,请将以下内容添加到MANIFEST.in中:

recursive-exclude tests *

答案 1 :(得分:17)

您应该在程序包的根级别创建一个名为MANIFEST.in的新文件,然后按照以下说明操作:

  1. 要控制哪些文件最终出现在tar文件中,请在程序包的根级别创建一个名为MANIFEST.in的新文件。例如,您可以使用recursive-exclude文件中的MANIFEST.in从发布中排除整个目录。在您的情况下,您需要MANIFEST.in文件包含:

    recursive-exclude tests *
    
  2. 在site-packages目录中包含README和其他文件并不常见,但如果您真的想要,请进入package1并创建要包含的文件的符号链接:< / p>

    cd package1
    ln -s ../LICENSE
    ln -s ../README.md
    ln -s ../RELEASE
    

    然后在setup.py中更改以下行:

    package_data = {
        '': ['LICENSE', 'README.md', 'RELEASE']
    

    为:

    package_data = {
        'package1': ['LICENSE', 'README.md', 'RELEASE']
    

答案 2 :(得分:0)

如果你的结构是真的:

  1. tests文件夹不是包(它没有 init .py文件),因此find_package不会将其排除。
  2. include_package_data = True表示如果未明确排除,则会包含所有版本化文件。
  3. 所以:在你的MANIFEST.in

    中尝试排除测试/ *

    我希望它有所帮助

答案 3 :(得分:0)

MANIFEST.in会照顾它。

prune tests/
include LICENSE  README.md RELEASE

如果要添加静态文件,请使用

添加它们
...
recursive-include package1/static *

答案 4 :(得分:0)

我一直在尝试一切,但似乎没有任何效果,直到我删除了build目录(看到another answer mentioning *.egg-info/ directory之后),它终于可以工作了。 python setup.py clean --all也应该做。