python == python2 ODER python == python3? Wie verpacke, verteile ich Python py2k Skripte?

10

Je nach System python== python2oder python== python3.

Ausführbare Python-Skripte, beginnt mit:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Für Python Py3K ist es in der Dokumentation enthalten. Ich sollte / kann es mit der Versionsnummer verwenden , also mache ich das:

#!/usr/bin/env python3

Aber ich habe ein Problem mit py2k-Skripten gefunden.

Während in py2k Dokumentation ist zu Verwendung geschrieben: #! /usr/bin/env python,

auf einigen * nix-es ist python py3k standardmäßig, also python == python3. (Zum Beispiel ArchLinux-Python-Paket , hier Python-Paketdateien ).

Wie kann man Python-Skripte für die Verteilung verpacken (konfigurieren, erstellen) und / oder vorbereiten, um dies zu handhaben?

Ich frage nach Softwarepaketen, die von Benutzern einfach ausgeführt werden können (ohne ihre Umgebung zu verändern).

Kann ich für Python-Py2K-Skripte den gleichen Trick wie für Python-Py3K-Skripte ausführen und Folgendes festlegen : #!/usr/bin/env python2? Kann ich sicher sein, dass jede Python-Py2K-Distribution eine python2Datei enthält , die also #!/usr/bin/env python2funktioniert?

Wenn ja, warum wird es nicht als Standard vorgeschlagen, beispielsweise in der Python Py2K-Dokumentation ?

Grzegorz Wierzowiecki
quelle
4
Soweit ich weiß, können Sie es immer verwenden python2, um es auszuführen (falls es installiert ist), und Sie können immer die Version mit überprüfen python -V. Wenn Sie möchten, dass pythondies 2 oder 3 ist, sollten Sie rm /usr/bin/pythondann einen Symlink erstellen, der auf Ihre gewünschte Python-Version verweist, z ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.
Vielen Dank, dass Sie mich informiert haben python2. Ich frage mich, warum es nicht Standard ist, es zu verwenden, wenn es py2k und py3k gibt und die Standardeinstellungen pythonunterschiedlich sein können. Was ist mit Ihrem Rat zum Entfernen - es ist nicht richtig für dieses Beispiel, weil ich nach der Verpackung frage. Ich möchte ein Paket erstellen, das in verschiedenen Konfigurationen / Systemen ausgeführt werden kann. Keine Möglichkeit, die Umgebung zu ändern. Was ist mit der Überprüfung - es gilt nicht für Shebang - soweit ich weiß.
Grzegorz Wierzowiecki
Ich glaube, @Hanan N. versucht Ihnen zu sagen, dass wenn Sie Python 2.x-Code schreiben, dann #!...python2in Ihren Programmen verwenden und wenn Sie Python 3.x verwenden, dann verwenden #!...python3. Verlassen Sie sich nicht darauf, dass das Betriebssystem den richtigen Link hat, wenn Sie wissen, dass es nur mit einer bestimmten Version funktioniert. Ich arbeite mit Systemen, auf denen Python 1.5.2 noch installiert ist. /usr/bin/pythonIch schreibe entweder Code, um ältere Python-Versionen zu verarbeiten, oder verwende ihn python2.
Arcege
2
@Arcege Ich habe keine python2ausführbare Datei auf meinem System (Debian Squeeze). pythonist ein Symlink zu python2.6und python3ist ein Symlink zu python3.1, aber es gibt keine python2.
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

Ein Skript kann seine Python-Version überprüfen und, wenn dies Python 3 ist, sich selbst mit Python 2 neu starten. Fügen Sie Folgendes am Kopf des Skripts hinzu:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Dies verwendet den whichBefehl des Systems , um python2in der Umgebung zu suchen PATH. Es startet sich dann neu damit (oder bricht ab, wenn es nicht gefunden werden kann).

Beachten Sie, dass das Skript eine gültige Python 3-Syntax haben muss, damit es in Python 3 gestartet werden kann.

Außerdem sollte jede Ausgabe vor dem execvAnruf geleert werden, da sie sonst verloren geht. Wenn Sie beispielsweise sys.stdout.flush()kurz vor dem Aufruf von execvhinzufügen, werden alle printAnweisungen gelöscht .

Sternenhimmel
quelle
1

Bei älteren Versionen kann es nur pythonstatt geben python2. Um Ihre Sheebang-Linie klarer zu machen, können Sie einen Link erstellen python2 -> python, den Sie verwenden können #!/usr/bin/env python2.

DocSalvager
quelle
Das angegebene Problem wird jedoch nicht gelöst. Weil die Frage ist, wie Sie Ihr Skript portabel genug machen können, damit es in allen genannten Umgebungen ausgeführt werden kann (mit "python" "python2" usw.)
Grzegorz Wierzowiecki
1

Ich denke, der "Standard" ist in https://www.python.org/dev/peps/pep-0394/ definiert.

Dieses PEP bietet eine Konvention, um sicherzustellen, dass Python-Skripte unabhängig von der Standardversion des Python-Interpreters (dh der vom Python-Befehl aufgerufenen Version) weiterhin auf * nix-Systemen portierbar sind.

  • python2 verweist auf eine Version von Python 2.x.
  • python3 verweist auf eine Version von Python 3.x.
  • Derzeit sollten alle Distributionen sicherstellen, dass Python auf dasselbe Ziel wie Python2 verweist.
  • Endbenutzer sollten sich jedoch darüber im Klaren sein, dass Python unter mindestens Arch Linux auf Python3 verweist (diese Änderung hat zur Erstellung dieses PEP geführt). Daher sollte Python in der Shebang-Zeile nur für Skripte verwendet werden, die mit Python 2 quellkompatibel sind und 3.
  • In Vorbereitung auf eine eventuelle Änderung der Standardversion von Python sollten nur Python 2-Skripte entweder aktualisiert werden, um mit Python 3 quellkompatibel zu sein, oder um Python2 in der Shebang-Zeile zu verwenden.
StrongBad
quelle