Seite 1 von 1

Programm ausführen und ergebnis auslesen!

Verfasst: Samstag 18. Dezember 2004, 17:01
von Iopodx
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 :)

Verfasst: Samstag 18. Dezember 2004, 17:55
von Milan
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...

Verfasst: Samstag 18. Dezember 2004, 18:12
von Iopodx
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?

Verfasst: Samstag 18. Dezember 2004, 19:13
von Leonidas
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()

Verfasst: Samstag 18. Dezember 2004, 19:41
von Iopodx
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 :)

Verfasst: Samstag 18. Dezember 2004, 19:57
von Leonidas
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.

Verfasst: Samstag 18. Dezember 2004, 21:24
von Milan

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

Verfasst: Samstag 18. Dezember 2004, 22:02
von Leonidas
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.

Verfasst: Samstag 18. Dezember 2004, 22:14
von Milan
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] .

Verfasst: Samstag 18. Dezember 2004, 22:31
von Leonidas
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.