Ausgabe von os.system speichern?

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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hallo liebe Community,

ich habe da nochmal eine Frage, also ich habe einen Pfad der sieht so aus: "%appdata%/Local/Activision/".
Da ich den genauen Pfand nicht kenne muss ich ihn erstmal herausfinden. Das habe ich mit os.system("echo %appdata%/Local/Activision/") gemacht.
Das Ergebnis ist das Richtige. Ich sehe den richtigen Pfand aber der Rückgabewert ist "0" und ich kann damit nicht arbeiten, weil ich ja den kompletten Pfad benötige. kann man das Ergebnis speichern?
Ich habe mit mal "subprocess" angesehen, aber ich werden daraus nicht schlau...

Mit freundlichen Grüßen
Schaf220
Zuletzt geändert von Schaf220 am Montag 19. Juli 2010, 12:50, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Statt os.system möchtest du das subproces-Modul verwenden.

Edit: Es existiert dazu gerade noch ein nahezu identischer Thread.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Mir wäre das egal, Hauptsache es würde mit einer der beiden Möglichkeiten funktionieren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie wäre es damit:

Code: Alles auswählen

In [48]: os.path.expandvars("%appdata%/Local/Activision/")
Out[48]: 'C:\\Dokumente und Einstellungen\\MECL User 1\\Anwendungsdaten/Local/Ac
tivision/'
Und generell: subprocess.Popen ist os.popen() vorzuziehen. Wobei es hier eben komplett überflüssig ist!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Wurde ihm alles schon gesagt: http://www.python-forum.de/viewtopic.php?f=1&t=23502

Aber der Mensch liest sich Tipps nicht durch und ist offensichtlich auch zu faul, mal auf einen Link zu klicken. Ärgert mich - sehr. Pure Zeitverschwendung, da hilfsbereit sein zu wollen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Barabbas hat geschrieben:Wurde ihm alles schon gesagt, wie EyDu schon angemerkt hat: http://www.python-forum.de/viewtopic.php?f=1&t=23502

Aber der Mensch liest sich Tipps nicht durch und ist offensichtlich auch zu faul, mal auf einen Link zu klicken. Ärgert mich - sehr. Pure Zeitverschwendung, da hilfsbereit sein zu wollen.
Also diese Frage wurde dort weder gestellt nocht beantwortet! Ich finde da kann man ruhig mal einen kurzen Tipp geben - zumal konkret nach Auflösung dieses einen Problems gefragt wurde. Ich persönlich kenne auch nicht alle Features der Standard-Lib und bin dann durchaus für so etwas dankbar.

Dass er schon wieder mit os.popen() rumgespielt hat, ok; aber das ist hierfür ja eh irrelevant gewesen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Tut mir leid, das ich euch so zur Last falle, aber ich verstehe subprocess einfach nicht. Es wird mir auch nicht klarer wenn ich mir die Doku dazu durchlese. Ich konnte deine Tipps Barabbas, ja auch gut gebrauchen, aber ich versteh nicht wie das "Popen" funktionieren soll. Es wird eine Datei verlangt, dabei frage ich mich wofür, mir werden die Bedeutungen der Parameter nicht klar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schaf220 hat geschrieben:Tut mir leid, das ich euch so zur Last falle, aber ich verstehe subprocess einfach nicht. Es wird mir auch nicht klarer wenn ich mir die Doku dazu durchlese. Ich konnte deine Tipps Barabbas, ja auch gut gebrauchen, aber ich versteh nicht wie das "Popen" funktionieren soll. Es wird eine Datei verlangt, dabei frage ich mich wofür, mir werden die Bedeutungen der Parameter nicht klar.
Ähh... hast Du Dir meine Antwort mal angeguckt? Dazu braucht es doch gar kein Popen-Kram!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hyperion hat geschrieben:Wie wäre es damit:

Code: Alles auswählen

In [48]: os.path.expandvars("%appdata%/Local/Activision/")
Out[48]: 'C:\\Dokumente und Einstellungen\\MECL User 1\\Anwendungsdaten/Local/Ac
tivision/'
Und generell: subprocess.Popen ist os.popen() vorzuziehen. Wobei es hier eben komplett überflüssig ist!
Leider klappt das nicht so richtig bei mir..., Was bedeutet dieses IN[48]?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hyperion hat geschrieben:
Schaf220 hat geschrieben:Tut mir leid, das ich euch so zur Last falle, aber ich verstehe subprocess einfach nicht. Es wird mir auch nicht klarer wenn ich mir die Doku dazu durchlese. Ich konnte deine Tipps Barabbas, ja auch gut gebrauchen, aber ich versteh nicht wie das "Popen" funktionieren soll. Es wird eine Datei verlangt, dabei frage ich mich wofür, mir werden die Bedeutungen der Parameter nicht klar.
Ähh... hast Du Dir meine Antwort mal angeguckt? Dazu braucht es doch gar kein Popen-Kram!
*g. Jetzt fühle ich mich verstanden ;).

@Schaf220: Du fällst uns nicht zur Last - ich habe nur den Eindruck, dass du dir nicht die Zeit nimmst, unsere (oftmals :)) guten und überlegten Hinweise auch zu befolgen. Nachfragen sind immer gerne gesehen - aber sie sollten schon zeigen, dass sich der Fragesteller die Tipps zu Herzen genommen hat. Und wenn du hier wieder mit os.system() ankommst, dann hat man etwas den Eindruck, man redet gegen Wände, was natürlich etwas frustriert.

Ich weiß nicht, wie man es erklären soll: Aber "externe" Befehle aufzurufen ist mit Python wirklich eher ein Ausnahmefall. Das benötigst du nur, wenn du ganz konkrete Programme fernsteuern oder starten möchtest. Alles was irgendwie zum Betriebsystemalltag gehört, kann Python i.d.R. auch ohne os.system() & Co (siehe Beitrag von Hyperion).

So: Viel Spaß noch und entschuldige mein Gemotze.

//edit: Diese Ins und Outs sowie Zeilennummern kannst du weglassen. Der Befehl lautet also:

Code: Alles auswählen

os.path.expandvars("%appdata%/Local/Activision/")
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

//edit: Diese Ins und Outs sowie Zeilennummern kannst du weglassen. Der Befehl lautet also:

Code: Alles auswählen

os.path.expandvars("%appdata%/Local/Activision/")
Ok ich habe nun alles verstanden, aber leider gibt der mir das Selbe ("%appdata%/Local/Activision/") wieder aus.

PS: kann das an meiner Pythonversion(2.5) liegen ?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schaf220 hat geschrieben:
Hyperion hat geschrieben:Wie wäre es damit:

Code: Alles auswählen

In [48]: os.path.expandvars("%appdata%/Local/Activision/")
Out[48]: 'C:\\Dokumente und Einstellungen\\MECL User 1\\Anwendungsdaten/Local/Ac
tivision/'
Und generell: subprocess.Popen ist os.popen() vorzuziehen. Wobei es hier eben komplett überflüssig ist!
Leider klappt das nicht so richtig bei mir..., Was bedeutet dieses IN[48]?
Vergiss das. Das ist nur die Ausgabe der ipython-Shell! Alles nach dem ":" ist relevant!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hyperion hat geschrieben:
Schaf220 hat geschrieben:
Hyperion hat geschrieben:Wie wäre es damit:

Code: Alles auswählen

In [48]: os.path.expandvars("%appdata%/Local/Activision/")
Out[48]: 'C:\\Dokumente und Einstellungen\\MECL User 1\\Anwendungsdaten/Local/Ac
tivision/'
Und generell: subprocess.Popen ist os.popen() vorzuziehen. Wobei es hier eben komplett überflüssig ist!
Leider klappt das nicht so richtig bei mir..., Was bedeutet dieses IN[48]?
Vergiss das. Das ist nur die Ausgabe der ipython-Shell! Alles nach dem ":" ist relevant!



OK, mit der python-Shell gehts aber wenn ich die Zeile in Eclipes starte wird nichts zuruck gegeben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Schaf220 hat geschrieben: OK, mit der python-Shell gehts aber wenn ich die Zeile in Eclipes starte wird nichts zuruck gegeben.
Dann tu's nicht ;-)

SCNR.

Kann ich mir auf die Schnelle nicht erklären.

Oder aber kann es sein, dass du das nicht printest? Vermutlich hat PyDev keine echte Python-Shell, sondern "nur" ein Standard- und Error-Out. Man muss den Rückgabewert schon explizit printen, damit man ihn "sieht".

Das ist übrigens einer der Gründe, weswegen ein Anfänger KEINE IDE verwenden sollte - imho zumindest :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Ok, es lag an der Interpreterversion 2.5. Mit Verion 2.6 geht alles wunderbar! Danke nochmal und Entschuldigung für alle Unannehmlichkeiten.

Mit freundlichen Grüßen
Schaf220
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nochmal ein Nachtrag zu os.system und subprocess: os.system liefert den return-Code, da der Befehl erfolgreich ausgeführt wurde ist er 0 (os.popen* macht das anders). Man sollte allerdings anstatt os.system/os.popen* lieber das subprocess Modul nutzen (welches nun wirklich nicht schwer zu verstehen ist, wenn man sich damit befasst). Um an den returncode zu kommen wie bei os.system nutzt man am Besten subprocess.call (allerdings auch nicht optimal, siehe warning), man kann auch eine Popen Objekt nutzen um an den returncode zu kommen (p=Popen([foo, bar]),p.returncode), wenn man die Ausgabe von stdout/stderr braucht, benutzt man am Besten ein Popen Objekt mit "communicate"

Code: Alles auswählen

p = Popen([foo, bar])
stdoutdata, stderrdata = p.communicate(None) # anstatt None, kann man dem Prozess noch was in stdin "mitgeben"
print stdoutdata
the more they change the more they stay the same
lunar

Das klingt jetzt so, als sollte man "call" gar nicht einsetzen, was nicht stimmt. "call" ist optimal, wenn man sie richtig einsetzt. Und jede Funktion ist nicht „optimal“, wenn man sie nicht richtig einsetzt ;)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

lunar hat geschrieben:Das klingt jetzt so, als sollte man "call" gar nicht einsetzen, was nicht stimmt.
So meinte ich das nicht und du hast natürlich recht ;).

Waas ich noch vergessen habe, call blockt und Popen nicht.
the more they change the more they stay the same
Antworten