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

0x4*_*B1D 21 python configuration setuptools

我对setuptools很新.我已经看到了一些类似的问题,它有点疯狂,我似乎遵循我看到的建议,但setuptools仍然做了一些不同于我想要的东西.

这是我的项目的结构:

.
..
package1/
    __init__.py
    abc.py
    ...
tests/
    __init__.py
    test_package1.py
LICENSE
README.md
RELEASE
setup.py
Run Code Online (Sandbox Code Playgroud)

这是我的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']
    },   
)
Run Code Online (Sandbox Code Playgroud)

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

include LICENSE
include RELEASE
include README.md
Run Code Online (Sandbox Code Playgroud)

我用以下内容构建tar:

python setup.py sdist
Run Code Online (Sandbox Code Playgroud)

我想要:

  1. tests从源代码分发中排除目录;
  2. 在site-packages目录中有LICENSE,README.md,RELEASE文件,可以在顶层,也可以在package1目录中(此时我同意).

相反,这是发生的事情:

  1. tests 目录仍然在创建的tar存档中,并安装到site-packages;
  2. 文件将复制到存档,但不会安装到程序包的站点打包目录中.

我没有想法,有人可以向我解释我做错了什么以及如何解决它?

oby*_*by1 21

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

>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False
Run Code Online (Sandbox Code Playgroud)

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

setup(
    name='package1',
    version='1.1',
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),    
)
Run Code Online (Sandbox Code Playgroud)

  • 我在“find_packages()”的语法上遇到了很多困难,我发现了一个有用的技巧,那就是在“setup.py”所在文件夹中的Python控制台中“导入setuptools”;然后执行类似的操作以查看它将列出哪些包以响应您选择的文件匹配模式:`print(setuptools.find_packages(where='YourSourceFolder', except=['tests', 'tests.*'] ))` (2认同)

ast*_*rog 18

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

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

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

    cd package1
    ln -s ../LICENSE
    ln -s ../README.md
    ln -s ../RELEASE
    
    Run Code Online (Sandbox Code Playgroud)

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

    package_data = {
        '': ['LICENSE', 'README.md', 'RELEASE']
    
    Run Code Online (Sandbox Code Playgroud)

    至:

    package_data = {
        'package1': ['LICENSE', 'README.md', 'RELEASE']
    
    Run Code Online (Sandbox Code Playgroud)


AXO*_*AXO 6

我尝试了一切,但似乎没有任何效果,直到我删除了该build目录(在看到另一个提到*.egg-info/目录的答案后),它终于起作用了。python setup.py clean --all也应该做好这项工作。