Seite 1 von 1
os.startfile unter Linux
Verfasst: Montag 6. Juli 2009, 14:15
von heidiweber
Hallo,
ich möchte unter Linux ein externes Programm (STATA -> ist ein Statistikprogramm) aufrufen, das dann im Batch-Modus laufen soll. Unter Windows kann man ja mit "os.startfile" externe Programme aufrufen.
Unter Linux funktioniert aber "os.startfile" nicht. Angeblich soll es auch keine Alternative dafür geben bzw. ich suche und suche und suche - aber finde nichts.
Geht das wirklich unter linux nicht? Bzw. wie macht man das dann?
Vielen Dank
Liebe Grüße
Heidi
Verfasst: Montag 6. Juli 2009, 14:20
von cofi
Nein unter Linux, Unix gibt es nicht so etwas wie die Windows Registry bei der sich Programme eintragen, darum geht das nicht. Allerdings ist das wirklich kein Verlust.
Wenn du einfach ein Programm starten willst:
subprocess
Aber ehrlich gesagt entnehme ich der Problemstellung keine sinnvolle Anwendung fuer ``os.startfile``
Verfasst: Montag 6. Juli 2009, 14:35
von Leonidas
``os.startfile`` ist ja nur dazu da, um eine Datei aufzurufen, als hätte der User darauf doppelgeklickt. Um Programme zu starten nutzt man sowohl unter Windows als auch Linux ``subprocess``.
Verfasst: Montag 6. Juli 2009, 14:57
von snafu
Mit `os.startfile('beispiel.doc')` wüsste er z.B. dass er das damit verknüpfte Programm (häufig ja Word) aufrufen und das Dokument dort laden soll. D.h. du musst dich nicht darum kümmern, was der Anwender zur Anzeige von doc-Dateien installiert hat. Für's Starten von Programmen nimmt man aber - wie schon gesagt wurde - `subprocess`.
Ein Pendant dazu wäre ein Python-Modul, dass die Informationen über die Verknüpfungen von deinem Windowmanager verwenden kann. Es ist verständlich, dass Python das nicht für alle möglichen WMs eingebaut hat.
Verfasst: Montag 6. Juli 2009, 15:07
von cofi
Du meinst nicht Windowmanager sondern Desktop Environments

Allerdings folgen die aber auch den Freedesktop.org Leitlinien, d.h. man koennte ein Modul schreiben, dass mit Mimetypes arbeitet und die passenden Dateien (~/.local/share/mimeapps.list, /usr/share/applications/mimeinfo.cache, ...) parst und die entsprechenden Programme startet.
Verfasst: Montag 6. Juli 2009, 15:09
von heidiweber
Vielen Dank erst mal.
So probiere ich das:
import subprocess, os
PIPE = subprocess.PIPE
p = subprocess.Popen('/stata/stata10/stata-mp -b do /daten/batch.do', stdin=PIPE, stdout=PIPE)
p.stdin.write("10")
p.stdin.flush()
print p.stdout.read() #Deadlock
print "End of Execution"
os.system("PAUSE")
Aber leider kommt folgende Fehlermeldung:
-bash-3.1$ /spss/python2.5.4/bin/python CallExternalProgramm.py
Traceback (most recent call last):
File "CallExternalProgramm.py", line 11, in <module>
p = subprocess.Popen('/stata/stata10/stata-mp -b do /daten/batch.do', stdin=PIPE, stdout=PIPE)
File "/spss/python2.5.4/lib/python2.5/subprocess.py", line 594, in __init__
errread, errwrite)
File "/spss/python2.5.4/lib/python2.5/subprocess.py", line 1097, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Der Aufruf '/stata/stata10/stata-mp -b do /daten/batch.do' sollte passen. Rufe ich dies in Java unter Linux auf, funktioniert das.
Was bedeutet diese Fehlermeldung.
OSError: [Errno 2] No such file or directory
Oder was könnte da nicht passen?
Vielen Dank
Grüße
Heidi
Verfasst: Montag 6. Juli 2009, 15:17
von busfahrer
Hallo
wenn ich mich recht entsinne,erwartet "subprocess" eine Liste.
z.B.
p = subprocess.Popen(["ls", "-l"])
Gruß...busfahrer
Verfasst: Montag 6. Juli 2009, 15:21
von cofi
heidiweber hat geschrieben:snip
Code: Alles auswählen
p = subprocess.Popen(['/stata/stata10/stata-mp', '-b', 'do', '/daten/batch.do'], stdin=PIPE, stdout=PIPE)
snap
Der ``OSError`` sagt, dass es das eben nicht gibt. Kann aber auch an der falschen Verwendung von ``subprocess.Popen`` liegen.
P.S. Bitte die \
Verfasst: Montag 6. Juli 2009, 15:58
von heidiweber
Vielen Dank euch allen. Sorry, dass ich keien Tags benutzt habe:((
Es schaut gut aus. Man muss das echt als Liste aufrufen:)
Gibt es jetzt noch eine Möglichkeit, auf das Ende des Prozesses zu warten? Bzw. Kann man irgendwie den Return-Code abfangen?
Vielen Dank
Grüße
Heidi
Verfasst: Montag 6. Juli 2009, 16:05
von snafu
Ja, `subprocess.call()` nutzen. Vielleicht demnächst mal die Doku besser lesen, wenn man von einem neuen Modul erfährt. Dann weiß man auch, welcher Typ als welches Argument erwartet wird.

Verfasst: Dienstag 7. Juli 2009, 09:52
von heidiweber
Hallo,
leider funktioniert das doch nicht so iwe ich dachte. Rufe ich den Subprozess mit Python dirket auf, funktioniert es. Jedoch binde ich das Python in SPSS (= Statistikprogramm) ein und rufe von da aus den Subprozess auf, dann kommt folgende Fehelrmeldung:
Traceback (most recent call last):
File "<string>", line 21, in <module>
File "/spss/python2.5.4/lib/python2.5/subprocess.py", line 444, in call
return Popen(*popenargs, **kwargs).wait()
File "/spss/python2.5.4/lib/python2.5/subprocess.py", line 1128, in wait
pid, sts = os.waitpid(self.pid, 0)
OSError: [Errno 10] Keine Kind-Prozesse
Heisst das, dass keine Kind-Prozesse erlaubt sind?
Wäre ja echt spitze...
Vielen Dank
Liebe Grüße
Heidi