Aufrufen externer Programme

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.
steinkeg
User
Beiträge: 1
Registriert: Montag 4. November 2002, 12:19

Montag 4. November 2002, 12:29

Kann man unter Python auf externe Programme zugreifen, diese ausführen, und die Ergebnisse wieder mit Python verarbeiten?
Ich arbeite auf einem UNIX-System und würde gerne auf bestehende Programme (z.Bsp hbplus) zugreifen, die einen anderen Sorcecode besitzen bzw. in anderen Scriptsprachen geschrieben wurden, und in Python einbinden.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Montag 4. November 2002, 14:23

Nichts leichter als ein anderes programm zu starten. Module os bietet mehrere Möglichkeiten, z. b.

Code: Alles auswählen

_stdin, _stdout, _stderr = fopen("/usr/bin/irgendetws param1 param2 ........")
for _s in _stdout.readLines():
   print _s.strip()
_stderr.close()
_stdout.close()
_stdin.clode()
es gibt da noch einige Artverwande befehle in dem Modul.

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Montag 4. November 2002, 16:14

meinst du nicht os.popen?

fopen kennt mein python nämlich nicht...
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Montag 4. November 2002, 16:27

:oops: schäm :oops:

meine natürlich

Code: Alles auswählen

_stdin, _stdout, _stderr = os.popen3("/usr/bin/irgendetws param1 param2 ........") 
os.popen() sollte aber auch gehen.

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Montag 4. November 2002, 17:03

Dann hab ich mal eine weiterführende Frage:

wie kann ich den Linux Befehl 'su' damit nutzen?

Code: Alles auswählen

#!/usr/bin/python

import os

_stdin, _stdout, _stderr  = os.popen3("su -c ./hello") 
_stdin.write('xXxXxXx')
_stdin.flush()
for _s in _stdout.readlines(): 
	print '%s'%_s.strip() 
_stderr.close() 
_stdout.close() 
_stdin.close()
(./hello ist ein programm das einfach nur "Hallo Welt" ausgibt)

passiert garnichts (d.h. er führt das programm aus aber es tut sich nix!)
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Montag 4. November 2002, 21:35

Mal abgeändert. Und was sehen wir jetz?

Code: Alles auswählen

#!/usr/bin/python

import os

_stdin, _stdout, _stderr  = os.popen3("su -c ./hello")
_stdin.write('xXxXxXx')
_stdin.flush()
for _s in _stdout.readlines():
   print '%s'%_s.strip()
for _s in _stderr.readlines():
   print '%s'%_s.strip()
_stderr.close()
_stdout.close()
_stdin.close() 
Wenn's eine gibt, dann gibt das Prog auch eine Fehlermeldung aus.

Ich wieß nicht ob es möglich ist, mit einem shellscript in Dialog zu treten. Vielleicht wissen aber andere mehr zu dem Thema.

Ich würde so vorgehen, das das Shellscipt den I/O Dialog selbst verwaltet, oder das Script so gestalten, dass es komplett mit Parametern / Umgebungsvariablen gefüttert wird. Für ereignisgesteuerte Programme eignen sich die GUI Programme wie QT, KDE, TK, etc. bestens. damit bekommt man dann auch komplexe Abläufe in den Griff.

Kannst ja mal auf mein HP stöbern. Da hat sich in den letzten Wochen schon einiges angesammelt, wo man das ein oder andere sehen kann. (Länger kenne ich Python auch noch nicht.)

Hans
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Montag 4. November 2002, 21:59

:?Boah ey, deine Version geht ja doch :?

bin wie folgt darauf gekommen:
  • Fehlerausgabe aktiviert (_stderr)
  • "su -c ./hello" durch "./hello" ersetzt.
  • hello.py gibt jetzt Fehlermeldung /bin/sh: line 1: ./hello: Keine Berechtigung aus.
  • chmod 755 ./hello
  • hello.py gibt Hello World aus
  • "su -c ./hello" wieder eingesetzt. Und jetzt funzt es auch mit der Nach.................

....und ich habe dabei auch noch was gelernt (_stdin)

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Dienstag 5. November 2002, 14:13

Interessant!

bei mir gibt nämlich der text:

Code: Alles auswählen

#!/usr/bin/python 

import os 

_stdin, _stdout, _stderr  = os.popen3("su -c ./hello") 
_stdin.write('xXxXx') 
_stdin.flush() 
for _s in _stderr.readlines(): 
   print '%s'%_s.strip() 
_stderr.close() 
_stdout.close() 
_stdin.close() 
... das aus:
su: must be run from a terminal
:?: :?: :?:

und ./hello hat 755!
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Dienstag 5. November 2002, 14:24

Tja, dass sind dir Feinheiten. Ich hatte mein Prog wie üblich aus einem Terminal heraus gestartet. Mache ich während der Entwicklung permanent. Schneller wie jede Maus!

Sag mal, mußt du mit su arbeiten? Geht alternativ nicht auch login? Dann gibt's da noch kdesu. Da habe ich aber gar keine Ahnung von.

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Dienstag 5. November 2002, 14:46

hans hat geschrieben:Tja, dass sind dir Feinheiten. Ich hatte mein Prog wie üblich aus einem Terminal heraus gestartet.
Ich auch! Über Telnet von einem Windoof-Rechner. Aber auch wenn ich die zwei schritte nach links gehe, also direkt an den Linux-Rechner, ändert sich nix!
hans hat geschrieben: Mache ich während der Entwicklung permanent. Schneller wie jede Maus!
Bei mir wäre die alternative Windows...
hans hat geschrieben: Sag mal, mußt du mit su arbeiten? Geht alternativ nicht auch login? Dann gibt's da noch kdesu. Da habe ich aber gar keine Ahnung von.
kdesu ist in cgi-Scripten (das ist nämlich das Ziel) nicht wirklich sinnvoll anzuwenden... :?


Und das hier:

Code: Alles auswählen

#!/usr/bin/python 

import os 
_stdin, _stdout, _stderr  = os.popen3("login root") 
_stdin.write('xXx')
_stdin.flush()
for _s in _stderr.readlines(): 
   print 'Err: %s'%_s.strip()
for _s in _stdout.readlines():
   print 'Out: %s'%_s.strip()

print os.environ

_stderr.close() 
_stdout.close() 
_stdin.close()
gibt mir nur die os.environ, und nach der ist er nicht als root angemeldet...
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Dienstag 5. November 2002, 17:56

Und wenn du ein anderes Login nimmst.

Solltest due ein SuSE irgendwas haben, dann kann es sein, dass root Zugriffe von externen Systemen auf dein System nicht erlaubt sind. Farg mich bitte nicht nach dem Parameter.

Wie wärs denn mit login -p username oder login -p -h hostname -f username?

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Mittwoch 6. November 2002, 14:03

[b|login -p root[/b] gibt wieder nix,

login -p -h linux486 -f root gibt:
_stderr: login: permission denied
das muss doch irgendwie gehen oda?
mfg,

10011110
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Donnerstag 14. November 2002, 00:37

Funktioniert dass denn mit einem anderen User als root? Es kann sein, dass ein root Zugriff von Remoter Seite aus verweigert wird. Das kann man einstellen.

Hans
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Donnerstag 14. November 2002, 15:44

Öööhm, ich hab jetzt ne andere Löscung gefunden.

Eine Konsultation unseres Schulpsychologen (ein Linux-Freak) hat mir sehr geholfen! :D

Es gibt ein Programm 'sudo' mit dem man für bestimmte User bestimmte Aktionen erlauben kann. Damit habe ich jetzt vor zu arbeiten.

Aber trotzdem Danke an deine Bemühungen!
mfg,

10011110
ASCII158
User
Beiträge: 80
Registriert: Samstag 28. September 2002, 15:40
Wohnort: München
Kontaktdaten:

Sonntag 17. November 2002, 14:35

Die Story ist leider immer noch nicht zu Ende. :oops:

Wenn ich aus meinem Python-Script 'sudo' wie folgt ausführe:

Code: Alles auswählen

_stdin, _stdout, _stderr  = os.popen3("sudo ./hello")
Dann gibt sudo nicht, wie ich gehofft hatte, seine Passwortabfrage über stdout aus, sondern direkt an die Konsole - also im Falle des Webservers in irgend ein 'Dämon-Nirvana'.

Weiss irgendwer wie ich das irgendwie lösen kann?

Danke!
mfg,

10011110
Antworten