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.
Aufrufen externer Programme
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Nichts leichter als ein anderes programm zu starten. Module os bietet mehrere Möglichkeiten, z. b. es gibt da noch einige Artverwande befehle in dem Modul.
Hans
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()
Hans
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
schäm
meine natürlich
os.popen() sollte aber auch gehen.
Hans
meine natürlich
Code: Alles auswählen
_stdin, _stdout, _stderr = os.popen3("/usr/bin/irgendetws param1 param2 ........")
Hans
Dann hab ich mal eine weiterführende Frage:
wie kann ich den Linux Befehl 'su' damit nutzen?
(./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!)
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()
passiert garnichts (d.h. er führt das programm aus aber es tut sich nix!)
mfg,
10011110
10011110
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Mal abgeändert. Und was sehen wir jetz? 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
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()
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
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
:?Boah ey, deine Version geht ja doch
bin wie folgt darauf gekommen:
....und ich habe dabei auch noch was gelernt (_stdin)
Hans
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
Interessant!
bei mir gibt nämlich der text:
... das aus:
und ./hello hat 755!
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()
su: must be run from a terminal
und ./hello hat 755!
mfg,
10011110
10011110
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
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
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
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:Tja, dass sind dir Feinheiten. Ich hatte mein Prog wie üblich aus einem Terminal heraus gestartet.
Bei mir wäre die alternative Windows...hans hat geschrieben: Mache ich während der Entwicklung permanent. Schneller wie jede Maus!
kdesu ist in cgi-Scripten (das ist nämlich das Ziel) nicht wirklich sinnvoll anzuwenden...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.
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()
mfg,
10011110
10011110
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
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
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
Öööhm, ich hab jetzt ne andere Löscung gefunden.
Eine Konsultation unseres Schulpsychologen (ein Linux-Freak) hat mir sehr geholfen!
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!
Eine Konsultation unseres Schulpsychologen (ein Linux-Freak) hat mir sehr geholfen!
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
10011110
Die Story ist leider immer noch nicht zu Ende.
Wenn ich aus meinem Python-Script 'sudo' wie folgt ausführe:
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!
Wenn ich aus meinem Python-Script 'sudo' wie folgt ausführe:
Code: Alles auswählen
_stdin, _stdout, _stderr = os.popen3("sudo ./hello")
Weiss irgendwer wie ich das irgendwie lösen kann?
Danke!
mfg,
10011110
10011110
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Ich kapier's immer noch nicht
In fünfzehn Jahren UNIX habe ich noch nicht einmal sudo benötigt. Entweder ich prüfe vorher die Rechte ab, bzw setze die Rechte so, das Otto Normalo das Programm auch ausführen kann oder ich mache es selbst (als Supervisor). Sollte bei Linux nicht anders sein.
sudo sollte zwar funktionieren, aber warum sollte ich einem User root - Rechte verpassen? Außerdem muß sudo entsprechend konfiguriert werden. Geht das kommandodenn aus der Shell heraus? Aber Vorsicht, die Shellvariablen der Konsole müssen nicht identischen Inhalts mit deiner Programmumgebung sein.
Also mal ohne sudo: Da gibt's soviel ich weiß standardmäßig eine Gruppe users oder ezeug eine Gruppe normalo und ordne jedem User der das Programm ausführen soll der/den Gruppen zu. Gruppen / User kann man in Suse 8.1 mit Yast2 Module / Sicherheit und Benutzer berabeiten und anlegen.
Dann machst du noch und das sollte es dann der ganze Zauber gewesen sein.
äääähhhhhhhh.. Wieso eigentlich Webserver? Soll das Script etwa als cgi-Script laufen oder als "normales" shellscript?
Hans
In fünfzehn Jahren UNIX habe ich noch nicht einmal sudo benötigt. Entweder ich prüfe vorher die Rechte ab, bzw setze die Rechte so, das Otto Normalo das Programm auch ausführen kann oder ich mache es selbst (als Supervisor). Sollte bei Linux nicht anders sein.
sudo sollte zwar funktionieren, aber warum sollte ich einem User root - Rechte verpassen? Außerdem muß sudo entsprechend konfiguriert werden. Geht das kommando
Code: Alles auswählen
sudo hello
Also mal ohne sudo: Da gibt's soviel ich weiß standardmäßig eine Gruppe users oder ezeug eine Gruppe normalo und ordne jedem User der das Programm ausführen soll der/den Gruppen zu. Gruppen / User kann man in Suse 8.1 mit Yast2 Module / Sicherheit und Benutzer berabeiten und anlegen.
Dann machst du noch
Code: Alles auswählen
chgrp users hello
äääähhhhhhhh.. Wieso eigentlich Webserver? Soll das Script etwa als cgi-Script laufen oder als "normales" shellscript?
Hans
Gehen wir das ganze mal anders an:
Was ich vorhabe ist für einen (noch-)nicht-Linux-Freak, der unbedingt einen Linux-Domain-Server haben will (verständlich), ein einfaches Cgi-Script zu schreiben, mit dem er User und Freigaben zumindest bis ers mit den .conf files kann hinzufügen, löschen und ändern kann.
D.h. dieses Script muss folgendes können:
- den Befehl adduser,
- den Befehl deluser und
- den Befehl moduser ausführen und ausserdem
- die Datei /etc/samba/smb.conf schreiben können.
Da ich den Webserver nicht unbedingt als root laufen lassen will, möchte ich, das das Script mit einem Passwort, das es vom User bekommt, sich die nötigen Rechte holt und dann loslegt.
Ich weiss nicht ob das möglich ist, aber ich fände schön wenn man das hinbekommen könnte.
Was ich vorhabe ist für einen (noch-)nicht-Linux-Freak, der unbedingt einen Linux-Domain-Server haben will (verständlich), ein einfaches Cgi-Script zu schreiben, mit dem er User und Freigaben zumindest bis ers mit den .conf files kann hinzufügen, löschen und ändern kann.
D.h. dieses Script muss folgendes können:
- den Befehl adduser,
- den Befehl deluser und
- den Befehl moduser ausführen und ausserdem
- die Datei /etc/samba/smb.conf schreiben können.
Da ich den Webserver nicht unbedingt als root laufen lassen will, möchte ich, das das Script mit einem Passwort, das es vom User bekommt, sich die nötigen Rechte holt und dann loslegt.
Ich weiss nicht ob das möglich ist, aber ich fände schön wenn man das hinbekommen könnte.
mfg,
10011110
10011110