为什么我的Python包的分类器没有出现在测试PyPI上?

时间:2014-10-09 17:35:33

标签: python packaging pypi

我正在学习如何按照Python Packaging User Guide中的建议发布Python包。我根据setuptools文档的Basic Use部分中的示例创建了一个简单的setup.py

from setuptools import setup, find_packages

setup(
    name="HelloWorld",
    version="0.1",
    packages=find_packages(),

    # metadata for upload to PyPI
    author="Me",
    author_email="me@example.com",
    description="This is an Example Package",
    url = "http://example.com/HelloWorld/",
    classifiers = [
        'Development Status :: 3 - Alpha',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: Python Software Foundation License',
        'Operating System :: OS Independent',
        'Programming Language :: Python :: 2',
    ],
)

我构建了源代码分发,在Test PyPI site注册了HelloWorld包,并使用twine将包的tarball上传到Test PyPI站点。但是,分类器不会出现在Test PyPI的包页面上。此外,它们不在发行版的PKG-INFO中:

# https://testpypi.python.org/pypi?name=HelloWorld&version=0.1&:action=display_pkginfo

Metadata-Version: 1.1
Name: HelloWorld
Version: 0.1
Author: Me
Author-email: me at example com
Home-page: http://example.com/HelloWorld/
Summary: This is an Example Package
Platform: UNKNOWN

1 个答案:

答案 0 :(得分:6)

我确认分类符确实出现在我运行setup.py sdist时创建的PKG-INFO文件中:

$ cat HelloWorld.egg-info/PKG-INFO

Metadata-Version: 1.0
Name: HelloWorld
Version: 0.1
Summary: This is an Example Package
Home-page: http://example.com/HelloWorld/
Author: Me
Author-email: me@example.com
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Python Software Foundation License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2

但第一行显示元数据版本为1.0(PEP 241),但在元数据版本1.1(PEP 314)中添加了分类器。即使我使用的是最新版本的setuptools(6.0.2),也未正确检测到元数据版本。

问题的原因是我的系统Python。我正在使用Python 2.7.2附带的OS X 10.8(Mountain Lion),如this SO answer中所述。此版本的a bug in metadata version detectionfixed in 2.7.3 。通过检查bug patch,我发现一种解决方法是将其中一个关键字 - providesrequiresobsoletes传递给setup函数。例如,添加setup调用:

setup(
    name="HelloWorld",
    version="0.2",
    # ...
    provides=['hours.of.debugging.fun'],
)

生成的本地PKG-INFO文件现在具有元数据版本1.1,分类器现在出现在Test PyPI站点上。