Python setuptools install_requires wird beim Überschreiben von cmdclass ignoriert

Ich habe eine setup.py , die so aussieht:

 from setuptools import setup from subprocess import call from setuptools.command.install import install class MyInstall(install): def run(self): call(["pip install -r requirements.txt --no-clean"], shell=True) install.run(self) setup( author='Attila Zseder', version='0.1', name='entity_extractor', packages=['...'], install_requires=['DAWG', 'mrjob', 'cchardet'], package_dir={'': 'modules'}, scripts=['...'], cmdclass={'install': MyInstall}, ) 

Ich brauche MyInstall weil ich einige Bibliotheken von github installieren möchte und ich nicht die Option dependency_links möchte, weil es entmutigt ist (zB hier ), also kann ich dies mit requirements.txt machen.

Wenn ich dieses Paket mit pip installieren, geht alles gut, aber aus irgendeinem Grund muss ich das in einer Weise lösen, dass es auch mit reiner python setup.py install . Und das geht nicht

Beim Überschreiben von cmdclass in setup() mit meiner eigenen Klasse scheint install_requires ignoriert zu werden. Sobald ich diese Zeile kommentiere, werden diese Pakete installiert.

Ich weiß, dass install_requires nicht unterstützt wird zB in distutils (wenn ich mich gut erinnere), aber es ist in setuptools. Und dann würde cmdclass keine Auswirkungen auf install_requires .

Ich googeln dieses Problem für Stunden, fand eine Menge von verwandten Antworten auf stackoverflow, aber nicht für dieses besondere Problem.

Mit dem Putting jedes benötigte Paket auf requirements.txt, alles funktioniert gut, aber ich würde gerne verstehen, warum dies geschieht. Vielen Dank!

2 Solutions collect form web for “Python setuptools install_requires wird beim Überschreiben von cmdclass ignoriert”

Das gleiche Problem ist mir gerade passiert. Es scheint irgendwie, wie etwas auslöst setuptools, um eine 'old-style install' mit distutils , was in der Tat keine install_requires .

Sie rufen install.run (self) an, die Run (self) in setuptools / setuptools / command / install.py, Zeile 51-74 aufruft

https://bitbucket.org/pypa/setuptools/src/8e8c50925f18eafb7e66fe020aa91a85b9a4b122/setuptools/command/install.py?at=default

 def run(self): # Explicit request for old-style install? Just do it if self.old_and_unmanageable or self.single_version_externally_managed: return _install.run(self) # Attempt to detect whether we were called from setup() or by another # command. If we were called by setup(), our caller will be the # 'run_command' method in 'distutils.dist', and *its* caller will be # the 'run_commands' method. If we were called any other way, our # immediate caller *might* be 'run_command', but it won't have been # called by 'run_commands'. This is slightly kludgy, but seems to # work. # caller = sys._getframe(2) caller_module = caller.f_globals.get('__name__','') caller_name = caller.f_code.co_name if caller_module != 'distutils.dist' or caller_name!='run_commands': # We weren't called from the command line or setup(), so we # should run in backward-compatibility mode to support bdist_* # commands. _install.run(self) else: self.do_egg_install() 

Ich bin nicht sicher, ob dieses Verhalten beabsichtigt ist, aber das Ersetzen

 install.run(self) 

mit

 install.do_egg_install() 

Sollte dein Problem lösen Zumindest funktioniert es für mich, aber ich würde auch eine ausführlichere Antwort schätzen. Vielen Dank!

Nach https://stackoverflow.com/a/20196065 kann ein korrekterer Weg dazu sein, bdist_egg Befehl bdist_egg zu überschreiben.

Du könntest es versuchen:

 from setuptools.command.bdist_egg import bdist_egg as _bdist_egg class bdist_egg(_bdist_egg): def run(self): call(["pip install -r requirements.txt --no-clean"], shell=True) _bdist_egg.run(self) ... setup(... cmdclass={'bdist_egg': bdist_egg}, # override bdist_egg ) 

Es hat für mich gearbeitet und install_require wird nicht mehr ignoriert. Trotzdem verstehe ich immer noch nicht, warum die meisten Leute scheinen, cmdclass install zu überschreiben und nicht zu beschweren, dass install_require ignoriert wird.

  • Warum funktioniert setup_requires nicht richtig für numpy?
  • Wie macht easy_install benutzerdefinierte Befehle in setup.py ausführen?
  • Wie unterscheiden sich Setuptools, Distribution und Pip aufeinander?
  • Pip: Irgendein Workaround zu vermeiden --allow-external?
  • Wie installiere ich eine alte Version von Django auf virtualenv?
  • Einfachste Möglichkeit, die benötigten Module in Python automatisch herunterzuladen?
  • Programmatische Erkennung von System-Proxy-Einstellungen unter Windows XP mit Python
  • Pip Installationsabhängige Links
  • Paket nur Binär kompiliert. So Dateien einer Python-Bibliothek mit Cython kompiliert
  • Pip ignoriert dependency_links in setup.py
  • Führen Sie eine Python-Skript-Post-Installation mit distutils / setuptools aus
  • Python ist die beste Programmiersprache der Welt.