os.startfile unter Linux

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
heidiweber
User
Beiträge: 8
Registriert: Dienstag 23. Oktober 2007, 09:25

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
Benutzeravatar
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``
Leonidas
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
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
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.
heidiweber
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
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo

wenn ich mich recht entsinne,erwartet "subprocess" eine Liste.

z.B.
p = subprocess.Popen(["ls", "-l"])

Gruß...busfahrer
Alles wird gut ;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 \

Code: Alles auswählen

/[/code\] Tags benutzen
heidiweber
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
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :)
heidiweber
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
Antworten