Python2 und Python3

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen
Ich sollte zwei Python Programme verknüpfen. Das eine wurde in Python 2 geschrieben, das andere in Python 3.
So wie ich es jetzt sehe bleibt mir keine andere Möglichkeit, als eine Art Hauptskript zu schreiben (in Python 3), welches immer wieder "os.system('python2.4 test24.py')" Calls enthält.
Gibt es eine professionelle, saubere Lösung dafür? Umschreiben des einen Programms wird leider nicht möglich sein..
Besten Dank für Hinweise.
[url=http://www.proandkon.com]proandkon.com[/url]
BlackJack

@mzh: Professioneller und sauberer ist auf jeden Fall erst einmal das `subprocess`-Modul statt `os.system()`.

Dann ist die Frage ob es sich vielleicht auch lohnt das andere Skript als Service zu schreiben, der am Anfang gestartet wird und dann mit einem RPC-Mechanismus aufzurufen.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

ok, ich schau mir gerade das subprocess modul an.
Was ich mich gefragt habe ist, ob es evtl. irgendwie möglich sein sollte so was wie

Code: Alles auswählen

#!/usr/bin/env python

def foo():
    print "bar"

def goo():
    print("gar")
so zu schreiben, dass foo mit Python 2.X und goo mit Python 3.X ausgeführt wird.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben: Was ich mich gefragt habe ist, ob es evtl. irgendwie möglich sein sollte so was wie

Code: Alles auswählen

#!/usr/bin/env python

def foo():
    print "bar"

def goo():
    print("gar")
so zu schreiben, dass foo mit Python 2.X und goo mit Python 3.X ausgeführt wird.
Wie sollte das gehen? Der jeweilige Interpreter liest ja immer die ganze Datei ein und nicht nur Stücke, die grad mal für ihn wie gültiger Code aussehen. Insofern wird der Python3 Interpreter das "print 'bar'" als syntaktischen Fehler ansehen.

Du könntest aber überlegen, ob man das Programm mit geringem Aufwand von 2.4 auf 3.2 portieren kann? Immerhin existiert ja 2to3. Vielleicht ist das auf Dauer der beste Weg.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

schon klar.
Trotzdem dachte ich mir, dass sich die Funktion evtl. als Python 2.x oder Python 3.x tauglich "markieren" lässt und der Interpreter dann entsprechend handelt.
Konvertieren ist leider keine Option, das Python 2.x Programm benötigt Numpy.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben: Konvertieren ist leider keine Option, das Python 2.x Programm benötigt Numpy.
Hat numpy nicht schon Python3-Support? Link
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Spannend.
Ich hab nur http://new.scipy.org/faq.html#does-nump ... bout-scipy geachtet.
Trotzdem, ungeachtet des konkreten Problems hier, die oben genannte "Markierung" ist nicht etwas was man machen kann, bzw. wofür es eine empfohlene Lösung gibt.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben: Trotzdem, ungeachtet des konkreten Problems hier, die oben genannte "Markierung" ist nicht etwas was man machen kann, bzw. wofür es eine empfohlene Lösung gibt.
Naja, Du müsstest eben die beiden Interpreter anfassen und deren Parsing-Routinen entsprechend anpassen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun, du kannst Versionsweichen benutzen und die versionsspezifischen Sachen in verschiedene Module packen. Oder in verschiedene Ordner mitdemselben Namen und den Import-Path veraendern.

Ok, ich glaub ich muss mich jetzt erstmal waschen. Ich fuehl mich schmutzig.
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

goodi.
ich schaus mir an.
[url=http://www.proandkon.com]proandkon.com[/url]
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

BlackJack hat geschrieben:@mzh: Professioneller und sauberer ist auf jeden Fall erst einmal das `subprocess`-Modul statt `os.system()`.
wieso?
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mzh hat geschrieben:
BlackJack hat geschrieben:@mzh: Professioneller und sauberer ist auf jeden Fall erst einmal das `subprocess`-Modul statt `os.system()`.
wieso?
Weil das subprocess-Modul u.a. alle vorherigen Ansätze von Systemaufrufen in ein Modul und eine API integriert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

@hyperion: Aha. Danke.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten