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
os.startfile unter Linux
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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``
Wenn du einfach ein Programm starten willst: subprocess
Aber ehrlich gesagt entnehme ich der Problemstellung keine sinnvolle Anwendung fuer ``os.startfile``
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
``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``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
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.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.
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.
-
- User
- Beiträge: 8
- Registriert: Dienstag 23. Oktober 2007, 09:25
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
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
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Der ``OSError`` sagt, dass es das eben nicht gibt. Kann aber auch an der falschen Verwendung von ``subprocess.Popen`` liegen.heidiweber hat geschrieben:snipCode: Alles auswählen
p = subprocess.Popen(['/stata/stata10/stata-mp', '-b', 'do', '/daten/batch.do'], stdin=PIPE, stdout=PIPE) snap
P.S. Bitte die \
Code: Alles auswählen
/[/code\] Tags benutzen
-
- User
- Beiträge: 8
- Registriert: Dienstag 23. Oktober 2007, 09:25
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
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
-
- User
- Beiträge: 8
- Registriert: Dienstag 23. Oktober 2007, 09:25
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
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