Programm ausführen und ergebnis auslesen!

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.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Programm ausführen und ergebnis auslesen!

Beitragvon Iopodx » Samstag 18. Dezember 2004, 17:01

Hiho gemeinde!

Ich bin grad dabei ein prog zu coden das die php.exe aufruft und einen Dateinamen als Argument übergibt. Soweit ist das ja kein Problem. Nun möchte ich aber das Ergebnis der php.exe in einer Variable/Liste speichern.

Jemand ne Idee?

Bin über jede schnelle Antwort dankbar :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 18. Dezember 2004, 17:55

HI. Schau dir mal das Modul subprocess an, bzw die Funktionen popen, popen3 und popen4 aus dem Modul popen2/os . Damit kannst du Prozesse starten, die mit einer Pipe zu deinem Programm verbunden sind. Über die Pipe kannst du dann lesen und schreiben :wink: . Hilfe findest du auch genug mit der Forensuche...
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Beitragvon Iopodx » Samstag 18. Dezember 2004, 18:12

Danke für die schnelle Antwort!

Schau ich mir gleich mal an.. was anderes:

wie übergebe ich Argumente ohne - ?

Denn die php.exe will die Datei ja in folgender Form haben:

c:\php.exe c:\test.php

aber python macht ja dann:

c:\php.exe -c:\test.php

gell?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 18. Dezember 2004, 19:13

Geht denn sowas nicht:

Code: Alles auswählen

import subprocess

pipe = subprocess.Popen('C:\php.exe C:\test.php', shell=True, stdout=subprocess.PIPE).stdout
print pipe.read()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Beitragvon Iopodx » Samstag 18. Dezember 2004, 19:41

Doch, danke :)

Habs gelöst..

so schaut das ganze aus:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import os, sys
datei=sys.argv[1]
inhalt=os.popen("c:\php\php.exe "+datei).readlines()
datei=datei.split('.')
file=open(datei[0]+".html", 'w')
i=0
try:
    while inhalt[i] !='':
        inhalt[i] = inhalt[i].replace('\n', '<br> ')
        file.write(inhalt[i])
        i=i+1
except: pass
file.close()
os.startfile(datei[0]+".html")


Danke nochmal :)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 18. Dezember 2004, 19:57

Jetzt muss ich unbedingt Dookie-like Optimierungen anbringen :D :

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import os, sys

try:
    datei = sys.argv[1]
except IndexError:
    print 'Dateiname fehlt'
    sys.exit()

inhalt = os.popen("c:\php\php.exe " + datei)
datei = datei.split('.')
parsed = file(datei[0] + ".html", 'w')

for line in inhalt.readlines():
    line = line.replace('\n', '<br> ')
    parsed.write(line)
parsed.close()
inhalt.close()

os.startfile(datei[0] + ".html")


Edit: Werden durch subprocess eigentlich die anderen Methoden deprecated?
Edit: Ich habe im Code file gegen parsed getauscht, damit das file() nicht überschrieben wird, das ich dann gleich mal statt open() benutzt habe.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 18. Dezember 2004, 21:24

Code: Alles auswählen

parsed.writelines(line.replace('\n', '<br> ') for line in inhalt)
parsed.close()
inhalt.close()

Gefällt mir besser :wink:

Leonidas hat geschrieben:Edit: Werden durch subprocess eigentlich die anderen Methoden deprecated?
Edit: Ich habe im Code file gegen parsed getauscht, damit das file() nicht überschrieben wird, das ich dann gleich mal statt open() benutzt habe.

Soweit ich gesehen habe: nein. Kann aber gut sein, da subprocess einfacher zu handhaben ist :D
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 18. Dezember 2004, 22:02

Milan hat geschrieben:

Code: Alles auswählen

parsed.writelines(line.replace('\n', '<br> ') for line in inhalt)
parsed.close()
inhalt.close()

Gefällt mir besser :wink:

Ahh! Sehr schön, eine Generator Expression! Werde ich irgendwann auch noch dokumentieren, oder möchtest du es machen, Milan? Das wäre sicher sehr hilfreich, vor allem für so Leute wie mich.

Milan hat geschrieben:
Leonidas hat geschrieben:Edit: Werden durch subprocess eigentlich die anderen Methoden deprecated?

Soweit ich gesehen habe: nein. Kann aber gut sein, da subprocess einfacher zu handhaben ist :D

Aja. Aber so besonders sinnvoll finde ich diese Neuerung nicht, das war ja alles schon vorher drin, jetzt ist es halt doppelt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 18. Dezember 2004, 22:14

Hi. Naja, so gut dokumentieren kann ich nicht. Im grunde ists ja nichts anderes als eine Listcomprehension, bei der keine Liste erzeugt wird. Vielleicht reicht das als Erklärung schon :?: . Aber einen Unterschied gibt es noch: ein Iterator kann nur genau einmal durchlaufen werden und nur Element für Element, also kann nichts so einfach übersprungen werden wie bei einer liste mit Liste=Liste[::2] .
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 18. Dezember 2004, 22:31

Kann bei einer LC etwas übersprungen werden? Doch, schon, nicht war, es ist ja eine normale Liste?
Gut Milan, das ist doch immerhin schon etwas, und macht das Prinzip schon mal klarer.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder