2015-05-19 3 views
5

ist sagen, dass ich ein Paket mit einer Konsole Skript wieWas ist der Zweck von Setuptool Anforderungen des Formulars „-Paket === Version“

from setuptools import setup 
setup(
    name='eg_package', 
    version='0.0.1', 
    description='Trivial test package', 
    packages=[ 
     'eg_package', 
    ], 
    entry_points={ 
     'console_scripts': [ 
      'foo = eg_package.main:main', 
     ] 
    }, 
) 

Wenn ich und explizitem Build-Tag gesetzt egg_info -b mytag das resultierende Skript hat __requires__ = 'eg-package===0.0.1mytag', dh mit 3 "=" Zeichen. Dies tritt auf, wenn das Tag nicht konventionell ist wie b1 für eine Betaversion.

Zuerst dachte ich, dies sei ein Fehler, aber die Dokumentation von setuptools schlägt vor, dass es sich um eine gültige Anforderungskennung handelt. Es funktioniert jedoch nicht mit älteren Versionen von setuptools, die Probleme mit unseren Systemen verursachen.

Meine Frage ist, was bedeutet "===" und warum verwendet setuptools es verwenden?

+1

Sie eine offizielle Beschreibung von '' === in PEP440 https finden: // www. python.org/dev/peps/pep-0440/#arbitrary-equality – cel

+0

Danke, das ist sehr vernünftig.Ich war an die permissiveren Regeln früherer Versionen von setuptools gewöhnt, aber ich bin froh, in strengere Versionszeichenfolgen gezwungen zu werden. Es ist schade, dass dies nicht in der [docs] (https://pythonhosted.org/setuptools/search.html) oder dem [packaging guide] (https://packaging.python.org/en/latest/) erwähnt wird. . –

+0

Mein besonderes Problem war, dass ein Build-System, das die neuesten setuptools ausführt, Debian-Pakete erstellt, die in Vanilla-Ubuntu-Systemen installiert werden, die nicht über die neuesten setuptools verfügen => PEP440-Anforderungsbeschreibungen werden nicht unterstützt. –

Antwort

2

Requirement specifier section in pip docs Links zu der official docs for requirement specifiers implemented by setuptoolspkg_resources. Sie gibt die formale Syntax an, sagt aber nichts zur Semantik. Overview docs erklären Semantik, aber sagen nichts über die ~= und === Sachen, die offenbar irgendwo zwischen vv.7 (mit Python installiert 2.7.9) hinzugefügt wurden und 16

Wenn docs scheitern, ist es Zeit, die Quellen zu konsultieren. Das Laden der setuptools hg repo und das Kommentieren pkg_resources/__init__.py bringt uns schließlich zu changeset 3125 mit der Mitteilung "Implementieren Sie PEP 440, indem Sie die Verpackungsbibliothek verwenden".

Tat erklärt PEP 440, Version Specifiers section die Syntax und Semantik:

Durch die Untersuchung andere Dateien in der Commit und das damit verbundene packaging Paket, kam ich zu diesen offensichtlichen Schlussfolgerungen:

  • ~= nie produziert wird; wenn es behandelt wird, fungiert es als ein Filter entsprechend den in der PEP umrissenen Regeln.
  • ===, wenn behandelt, Signale auf die ältere setuptools Version Syntax und Vergleichslogik zurückgreifen. Es wird immer dann erzeugt, wenn die resultierende Versionszeichenfolge nicht mit dem PEP übereinstimmt.

In pkg_resources._vendor.packaging.specifiers._compare_compatible() pkg_resources.parse_version() erzeugt ein pkg_resources.SetuptoolsLegacyVersion statt pkg_resources.SetuptoolsVersion