subprocess modul

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.
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

subprocess modul

Beitragvon KaiAllard » Montag 12. Februar 2007, 17:31

Grüß euch,

ich lerne zur Zeit Python und experimentiere erst ein wenig herum.
Da das neue 2.4er Modul "subprocess" viele der älteren execution environments ersetzen soll, möchte ich mehr darüber erfahren. In meinem Buch und in den Python Docs steht schon einiges, doch habe ich noch einige Fragen.

Folgendes Szenario:
Ich möchte ein auf der Festplatte vorliegendes Programm in meinem Skript aufrufen, natürlich Parameter übergeben und dann dessen Output von dem SDTOUT in ein File umleiten.

Danke euch für die Vorschläge.

PS: Wie würde eine os.fork, os.exec*, os.wait* variante davon aussehen.

Ich kann mal schemenhalft angeben was ich mir denke.

Code: Alles auswählen

import os

ret = os.fork()
if ret == 0
    execl('binaryfile', ['binaryfile', 'argument1', ...])
    #oder
    execvp('perl Script.pl', ['perl Script.pl', 'argument1', ...])
    #und falls python
    execfile('Script.py')
else
    os.wait()

Auch hier bleibt meine Frage wie man den Output abfängt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 12. Februar 2007, 18:38

Hoi und willkommen im Forum,

am besten Du schaust Dir mal die Moduldokumentation an und vielleicht magst Du Dir auch die [wiki=Neue_Features#Subprocess]entsprechende Wikiseite[/wiki] ansehen und hier im Forum suchen? (Es gab nämlich schon viele Threads zum Thema subprocess ;-) .)
Was das Thema "in ein File umleiten" anbelangt: Kennst Du das logging Modul? Das kann u. U. - je nachdem was Du genau tun möchtest - nützlich sein.

Gruß,
Christian
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Montag 12. Februar 2007, 22:52

der Höflichkeit halber hier einfach mal ein schnelles (ungetestetes) Beispiel mit subprocess:

Code: Alles auswählen

from subprocess import Popen

# das tolle an Popen ist meiner Meinung nach, dass man alle Moeglichkeiten
# vereint hat, die es vorher gab. So ja auch der Sinn, der Sache ;)

cmd = list()
cmd.append(pfad_zum_programm)
cmd.append(erstes_argument)
cmd.append(zweites_argument)
cmd.append(drittes_argument)

# da du die Ausgabe in eine Datei umleiten willst:
stdout = file("ausgabe.log", "r")
stderr = file("error.log", "r")

# nun zum eigentlichen Programmaufruf:
Popen(cmd, stdout=stdout, stderr=stderr, close_fds=True)

# close_fds=True sorgt hier dafuer, dass stdout und stderr nach
# ausfuehrung des Programmes geschlossen werden. Standardmäßig
# steht es auf False


Ja ich denke das ist das wichtigste... fuer kleinere Schusseligkeitsfehler uebernehme ich keine Haftung, nein ich verschenke sie sogar an dich ;)

MfG
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Beitragvon skypa » Dienstag 13. Februar 2007, 07:33

In Anlehnung zum bisherigen:

Benutzt man das subprocess-modul um Hooks zu programmieren?
Und wie sieht das unter Python aus?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 13. Februar 2007, 10:12

skypa hat geschrieben:Benutzt man das subprocess-modul um Hooks zu programmieren? Und wie sieht das unter Python aus?

Hi skypa!

Ich arbeite unter Visual Basic 6 sehr oft mit Hooks, die Python-Programme aufrufen. Dort verwende ich eine spezielle Art von ShellWait, damit mir das Programm während der Ausführung nicht wegläuft. ;-)

Unter Python kannst du mit subprocess andere Programme aufrufen und darauf warten, bis die Arbeit getan ist. Das wäre für mich so ein Hook, wenn ich z.B. in einem Ordner Python-Programme hätte, die nur unter bestimmten Umständen vom Hauptprogramm aufgerufen werden und evt. etwas an das Hauptprogramm zurück geben.

Du kannst an das aufgerufene Programm, Parameter über die Kommandozeile übergeben. Du kannst über so einen Kommandozeilenparameter den Pfad zu einer Datei mit Daten übergeben. Du kannst aber auch direkt über STDIN des aufgerufenen Programms Daten übergeben.
http://www.python-forum.de/topic-4941.html

Daten bekommst du z.B. über STDOUT des aufgerufenen Programms zurück. Über STDOUT kannst du soger gepickelte Daten zurück geben. Du könntest aber auch die Ergebnisdaten in eine Datei schreiben und diese vom Hauptprogramm auslesen lassen. So habe ich es z.B. bei meinem letzten Projekt gemacht.

Das Handelskassenprogramm, ein Visual Basic 6 Programm, erstellt eine INI-Datei. Das Python-Programm wird mit ShellWait aufgerufen. Dabei wird über Kommandozeilenparameter der Pfad zur Ini-Datei übergeben. Das Python-Programm liest die INI-Datei aus und weiß daraufhin was es zu tun hat. In der INI-Datei steht auch ein Pfad zur erwarteten Ergebnisdatei. Das Python-Programm erstellt eine neue INI-Datei und schreibt die Ergebnisse in diese Datei. Sobals das Python-Programm beendet ist, liest das VB6-Programm die Erebnis-INI-Datei aus und arbeitet weiter. Das hört sich komplizierter an als es ist. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Beitragvon skypa » Dienstag 13. Februar 2007, 10:29

Naja fast Gerold :D
Aber wir meinen dasgleiche glaub ich...
Mit Hooking mein ich das eigentliche "einhaken" in andere Software bzw Prozesse...
z.B. wie Bot Programme... Map Hacks (Diablo2)...

Ich will nicht unbedingt sowas programmieren (zumindest nicht jetzt)...
aber find ichs recht intressant, da man damit doch Reverse Engineering betreiben kann ?! könnte man doch auch auf viren oder Trojaner übertragen um Funktionsweisen zu studieren?!

Oder bin ich einfach total im falschen film?
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Beitragvon KaiAllard » Dienstag 13. Februar 2007, 11:55

Hooks haben meines Wissens mehrere Bedeutungen.

Hooks sind erstens überwachende Funktionen oder zweitens custom Module die vom Programmierer an eigene Bedürfnisse angepasst werden können.

könnte man doch auch auf viren oder Trojaner übertragen um Funktionsweisen zu studieren?!


Na ich hoffe, dass der obige Satz in einem Anflug von Witzigkeit geschrieben worden ist...
KaiAllard
User
Beiträge: 9
Registriert: Mittwoch 8. November 2006, 16:59

Beitragvon KaiAllard » Dienstag 13. Februar 2007, 12:00

Sonst danke ich den übrigen für ihre Hilfe.

Ich werde mir die Beispiele ansehen.

Weiß jemand ob das Popen Modul aus subprocess, sowohl auf Win32 als auch auch Unix Platformen arbeitet. Ich hatte beim Ausprobieren das Gefühl, dass nicht alle Methoden auch in Windows existieren (ich meine in etwa wie zum Beispiel os.fork() auf Windows keine Funktionalität hat).
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 13. Februar 2007, 12:29

Ja, es gibt ein paar Methoden die nur mit Linux/Unix gibt... Das liegt einfach am OS, IMHO... Steht alles in der Doku: http://docs.python.org/lib/node533.html

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 13. Februar 2007, 12:30

Ich denke (weiß aber nicht hundertprozentig) das alles unter Windoze gehen muesste, was mit dem Subprocess-Modul gemacht worden ist.

So dinge wie os.fork koennten da schon schwieriger werden. Ein weiteres Pro fuer subprocess (ich mag subprocess 8) ).

Zu den Hooks: Ich glaube, ein reinen Pythonprogramm ist kaum faehig dazu, ohne weiteres in Speicherbereichen anderer Programme rumzupfuschen. Ich denke dazu braucht es ein C-Modul (was aber unter Python wiederum kein Problem ist).

Gruesse
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 13. Februar 2007, 12:41

nkoehring hat geschrieben:in Speicherbereichen anderer Programme rumzupfuschen.

Ich kenne mich da nicht wirklich aus. Aber IMHO verhindert das OS so etwas, oder? Da muss man sicherlich tief in die Trickkiste greifen.

Um Trojaner und Co. zu untersuchen eignet sich wohl eine VM.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Dienstag 13. Februar 2007, 13:53

jens hat geschrieben:
nkoehring hat geschrieben:in Speicherbereichen anderer Programme rumzupfuschen.

Ich kenne mich da nicht wirklich aus. Aber IMHO verhindert das OS so etwas, oder?

Das sollte es. Das waere ja auch noch schoener, wenn man mit fehlerhaften Pointern nicht nur sein eigenes, sondern auch andere Programme abschmieren lassen koennte...
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Beitragvon skypa » Dienstag 13. Februar 2007, 14:59

Wenn ich euch richtig verstanden ist es möglich, ABER ihr wisst nicht wie?!
und ja ich meine mit hooking den speicherbereich verändern.. sprich das es abschmiert, sprich das man es manipulieren kann...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Dienstag 13. Februar 2007, 15:17

Also du meinst das, was auch Debugger machen?

Es gibt unter Linux den System-Call ptrace. Da gibt es aber keine Python-Anbindung fuer.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Beitragvon skypa » Dienstag 13. Februar 2007, 15:33

In etwas wie ein Debugger... ich meine eher eine Art von Injektion.

Ich hab vor geraumer Zeit mal ein Hook in Delphi (war das glaub ich gesehen). Und will halt wissen ob das auch mit python möglich ist...

gutes beispiel ist glaub ich ein maphack. er "injeziert" sich in die Anwendung, sucht sich die infos die er eben brauch, und gibt dann eine Route im Spiel selbst aus...

Ich wills gar net so umfangreich... aber intressiert mich schon, ob ich grad eine Sprache lerne mit der ich ALLES machen kann, oder fast alles...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder