Frage

Am Anfang aller meiner ausführbaren Python-Skripte habe ich das eingefügt Mist Linie:

#!/usr/bin/env python

Ich führe diese Skripte auf einem System aus, auf dem env python ergibt eine Python 2.2-Umgebung.Meine Skripte schlagen schnell fehl, weil ich manuell nach einer kompatiblen Python-Version suche:

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

Ich möchte nicht die Shebang-Zeile in jeder ausführbaren Datei ändern müssen, wenn es möglich ist;Ich habe jedoch keinen Administratorzugriff auf die Maschine, um das Ergebnis zu ändern env python und ich möchte keine bestimmte Version erzwingen, wie in:

#!/usr/bin/env python2.4

Ich möchte dies vermeiden, da das System möglicherweise eine neuere Version als Python 2.4 oder Python 2.5, aber kein Python 2.4 hat.

Was ist die elegante Lösung?

[Bearbeiten:] Ich habe die Frage nicht genau genug gestellt – ich möchte, dass Benutzer die Skripte ohne manuelle Konfiguration ausführen (z. B.Pfadänderung oder Symlinking ~/bin und sicherstellen, dass Ihr PATH vorhanden ist ~/bin vor dem Python 2.2-Pfad).Möglicherweise ist ein Distributionsprogramm erforderlich, um die manuellen Anpassungen zu verhindern?

War es hilfreich?

Lösung

„env“ führt einfach das erste aus, was es in der PATH-Env-Variable findet.Um zu einem anderen Python zu wechseln, stellen Sie dem Pfad das Verzeichnis für die ausführbare Datei dieses Pythons voran, bevor Sie Ihr Skript aufrufen.

Andere Tipps

Ziemlich hackige Lösung – wenn Ihre Prüfung fehlschlägt, verwenden Sie diese Funktion (die wahrscheinlich erheblich verbessert werden könnte), um den besten verfügbaren Interpreter zu ermitteln, festzustellen, ob er akzeptabel ist, und wenn ja, starten Sie Ihr Skript mit os.system oder etwas Ähnlichem und Ihrem System neu. argv mit dem neuen Interpreter.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

Wenn Sie die Skripte ausführen, können Sie Ihre PATH-Variable zunächst so festlegen, dass sie auf ein privates bin-Verzeichnis verweist:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

Wenn Sie dann Ihr Python-Skript ausführen, wird Python 2.4 verwendet.Sie müssen Ihre Anmeldeskripts ändern, um Ihren PATH zu ändern.

Alternativ führen Sie Ihr Python-Skript mit dem gewünschten expliziten Interpreter aus:

$ /path/to/python2.4 <your script>

@morais:Das ist eine interessante Idee, aber ich denke, wir können vielleicht noch einen Schritt weiter gehen.Vielleicht gibt es eine Möglichkeit, es zu verwenden Ian Bickings virtuelle Umgebung Zu:

  • Prüfen Sie zunächst, ob wir in einer akzeptablen Umgebung laufen, und wenn ja, unternehmen Sie nichts.
  • Überprüfen Sie, ob eine versionenspezifische ausführbare Datei vorhanden ist PATH, d.h.Überprüfen Sie, ob python2.x existiert for x in reverse(range(4, 10)).Wenn ja, führen Sie den Befehl mit dem besseren Interpreter erneut aus.
  • Wenn kein besserer Interpreter vorhanden ist, versuchen Sie mit virtualenv, eine neuere Version von Python von der älteren Version von Python zu installieren und alle erforderlichen Pakete abzurufen.

Ich habe keine Ahnung, ob Virtualenv dazu in der Lage ist, also werde ich bald damit herumexperimentieren.:) :)

Hier ist eine Lösung, wenn Sie (1) unbedingt Shebangs verwenden möchten und (2) in der Lage sind, Autotools in Ihrem Build-Prozess zu verwenden.

Ich habe erst gestern Abend herausgefunden, dass man das Autoconf-Makro verwenden kann AM_PATH_PYTHON um ein minimales Python zu finden 2 binär.Die Anleitung ist Hier.

Ihr Prozess wäre also:

  • Geben Sie eine aus AM_PATH_PYTHON(2.4) in deinem configure.ac
  • Benennen Sie alle um .py Skripte zu .py.in (Meiner Erfahrung nach ist das nicht verwirrend vi)
  • Benennen Sie alle Python-Skripte, mit denen Sie generieren möchten AC_CONFIG_FILES.
  • Anstatt mit zu beginnen #!/usr/bin/env python, verwenden #!@PYTHON@

Dann Ihr resultierend Python-Skripte haben immer den passenden Inhalt.

Sie haben also diese Lösung, zumindest möglich, wenn auch nicht praktikabel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top