2015-01-15 3 views
8

Ich stieß auf ein Problem bei der Installation eines Pakets, das von python-daemon abhängig war. Letztendlich habe ich es auf die neueste Version des gestern veröffentlichten Pakets python-daemon (2.0.3) zurückverfolgt. Testen in einer virtuellen Umgebung auf einer 14,04 Maschine Ubuntu und Ausgabe die folgenden Befehle ein: etwas betroffen pip oder setuptoolsWie können Sie Build-Time-Abhängigkeiten deklarieren, ohne andere Pakete zu beschädigen?

(venv) $ pip list 
argparse (1.2.1) 
pip (1.5.6) 
setuptools (3.6) 
wsgiref (0.1.2) 
(venv) $ pip install redis 
... works fine .... 
(venv) $ pip install python-daemon 
... 
snip 
... 
File "/home/pwj/.virtualenvs/venv/local/lib/python2.7/site-packages/pkg_resources.py", line 2147, in load 

['__name__']) 

ImportError: No module named version 

(venv)02:15 PM tmp$ pip list 
argparse (1.2.1) 
lockfile (0.10.2) 
pip (1.5.6) 
python-daemon (2.0.3) 
setuptools (3.6) 
wsgiref (0.1.2) 

die so von python-daemon installieren schienen aber zu arbeiten, weil andere Pakete (celery, flask), ich versuche zu installieren mit pip danach mir die gleiche Zurückverfolgungs gibt:

... 
snip 
... 

File "/home/pwj/.virtualenvs/venv/local/lib/python2.7/site-packages/pkg_resources.py", line 2147, in load 

['__name__']) 

ImportError: No module named version 

Wenn ich deinstallieren python-Daemon mit pip Dinge wieder und Pakete, die nicht jetzt wurden die Installation installieren Ordnung. Ist jemand anderes mit einem anderen Projekt auf etwas Ähnliches gestoßen? Meine Lösung war, die vorherige Version

zu installieren, aber ich fragte mich, was einen solchen Fehler verursachen könnte.

+0

Ab Python-Daemon-Version 2.0.4 ist dieses Problem gelöst, dank Python-Daemon-Entwickler (s). –

Antwort

4

(Dieses Verhalten in Python-Daemon Version 2.0.4 und später korrigiert.)

Es gibt zwei Seiten zu diesem:

  • Setuptools nimmt das Zentrum von allem ist.
  • Version 2.0.3 von Python-Daemon berücksichtigt dies nicht.

Eine detailliertere Erläuterung: Es gibt einige komplexen Codes Docutils beteiligt in dem Python-Daemon build Verfahren, das nicht nach benötigt installieren und ist nicht Bestandteil des Bibliothekscodes.

Es ist zu komplex in der un-importierbar zu verlassen (und daher nicht einheits prüfbar) setup.py, so dass Build-Code auf einen separaten prüfbar Modul abgezweigt wird, version (in der Datei version.py), die sich Docutils verwendet.

Aber dann hat die setup.py eine zirkuläre Abhängigkeit: Wie version zu importieren, wenn Docutils noch nicht installiert ist? Wie man Setuptools verwendet, um sicherzustellen, dass Docutils installiert ist, wenn setup.py zum Abschluss ausgeführt wird, muss version? Alle möglichen Lösungen sind hässlich und verwirrend.

Der Ansatz in 'Python-Daemon' 2.0.3 ist Docutils für die Einrichtung zu deklarieren und eine Setuptools entry point für die Arbeit zu deklarieren, die version benötigt. Auf diese Weise kann setup.py Docutils vor einem der Einstiegspunkte installieren, die version verwenden.

Aber jetzt kommen wir zum ersten Punkt, dass sich Setuptools als Zentrum von allem anmaßt. Durch die Deklaration eines Einstiegspunkts hat setup.pyjede Aktion Aktion danach geändert, und jedes Paket schlägt fehl, wenn es die Einstiegspunkte nicht finden kann. Und da die meisten von ihnen version oder die angegebenen Funktionen in diesem Modul nicht haben, stürzen sie Setuptools ab.

Was im Wesentlichen ein Fehler ist, der behoben werden muss, deckt einen schlecht verstandenen Eckfall in Setuptools auf. Also wähle ich deine Frage.

Es scheint keine gute Lösung zu sein: Module für setup.py verfügbar zu haben, aber sicherzustellen, dass die Anforderungen zuerst erfüllt werden. Setuptools nimmt an, dass es das einzige Build-System ist, das benötigt wird, um alle Abhängigkeiten für alles zu erfüllen, und wenn diese Annahme fehlschlägt, ist es sehr schwierig, herumzukommen.

Dank der Python Packaging Authority Leute, und die distutils-sig forum, für die Erklärung zu mir.

+0

keine temporäre/alternative Lösung zur Installation von Python-Daemon? – Ali

+0

@Ali Ab Python-Daemon Version 2.0.4 ist dieses Problem behoben –

+0

@bignose Ich nehme an, du bist der Entwickler. Ähnliches passiert mit pip 6.1.1 und python-daemon == 2.0.5: venv/local/lib/python2.7/site-packages/setuptools/dist.py: 291: UserWarning: Die angegebene Version (u'UNKNOWN ') ist eine ungültige Version, dies funktioniert möglicherweise nicht wie erwartet mit neueren Versionen von setuptools, pip und PyPI. Bitte beachten Sie PEP 440 für weitere Details. "Details." % self.metadata.version Fehler: Die Distribution 'python-daemon == 2.0.5' wurde nicht gefunden und wird von ... benötigt. – jbrown