pythonw und subprocess.popen

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.
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Donnerstag 4. Oktober 2007, 11:40

Hi zusammen,
ich bin hier auf ein Problem gestoßen, und zwar habe ich eine Anwendung mit GUI (GTK & pygtk) unter Windows, die eigentlich wunderbar funktioniert. Jetzt habe ich meine Fehlermeldungen alle aus der Console in die GUI umgeleitet und würde gerne das Consolenfenster loswerden. Ich habe dies mit "pythonw" probiert, alles sieht soweit ganz gut aus. Bis zu dem Zeitpunkt, als ich mit subprocess.popen die ausgabe eines anderen Programmes in die GUI pipe. Wie gesagt, mit python.exe läuft alles wunderbar, mit pythonw.exe ist die PIPE einfach nur leer. Keine Fehlermeldung, kein GUI-freeze, einfach nur Leere...

Woran könnte das liegen?
Für Hinweise wäre ich sehr dankbar...


Code: Alles auswählen

        try:
            #find . \! -name '*.*' -type d -maxdepth 1
            cmd = [" find //usr//discreet//clip//stonefs \\! -name '*.*' -type d -maxdepth 1"]               
            test = subprocess.Popen(' '.join(cmd), shell=True, stdin=subprocess.STDOUT, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
        
            for line in test.stdout:
                self.oImcopyOutput.get_buffer().insert_at_cursor("2FLAME: " + line +" \n")


        except:
            self.oImcopyOutput.get_buffer().insert_at_cursor("2FLAME: Could not get existing projects on Flame \n")
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Freitag 5. Oktober 2007, 09:30

Nach weiterem googlen habe ich folgende Aussage gefunden:
I thought pythonw didn't provide a console and so it could be that
stdin and stdout aren't connected to anything. Popen therefore doesn't
make sense.
Stimmt es also: mit pythonw kein popen??? Gibt es vielleicht einen anderen Ausweg? Workaround?

Gruß Philipp
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Freitag 5. Oktober 2007, 10:11

Probier mal, sys.stdout in eine Datei umzuleiten.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 5. Oktober 2007, 10:13

2d23d hat geschrieben:Stimmt es also: mit pythonw kein popen?
Hallo Philipp!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import subprocess
import wx

app = wx.PySimpleApp(redirect = True)

proc = subprocess.Popen(["dir"], stdout = subprocess.PIPE)
print proc.stdout.read()

app.MainLoop()

# Das funktioniert as "hallo.py" genau so gut wie als "hallo.pyw".
Dein Problem liegt eher darin, dass du STDIN nach STDOUT umleitest. ???

Weiters verstehe ich nicht, dass du von Windows sprichst aber im Code "//usr//discreet//clip//stonefs" steht. Wird dein Skript unter Cygwin gestartet? Also pythonw.exe wird unter Cygwin nicht funktionieren.

Irgendetwas kapiere ich da nicht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Freitag 5. Oktober 2007, 12:18

Hi, und danke für die Hinweise.

Probier mal, sys.stdout in eine Datei umzuleiten.
Wenn ich stdout in eine Datei umleite, habe ich ungefähr den gleichen Effekt (mit python.exe schreibt er was in die Datei, mit pythonw bleibt sie leer...)

Code: Alles auswählen

test = subprocess.Popen(' '.join(cmd), stdout=open('output.tmp', 'w'))
Dein Problem liegt eher darin, dass du STDIN nach STDOUT umleitest.
Ich habs auch mal probiert, nur den stdout zu pipen (keine Änderung)

Code: Alles auswählen

test = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE)
...Windows sprichst aber im Code "//usr//discreet//clip//stonefs" steht
Muss mich entschuldigen, habe den Befehl gekürzt, da ich den Rest für unerheblich hielt (eigentlich starte ich von Windows aus via plink einen Befehl auf einem Linux-Rechner...)

Code: Alles auswählen

cmd = ["\\\\"+iIP+"\\backbone\\Programs_MUC\\bin\\plink.exe -i \\\\"+iIP+"\\devel\\Scripts\\liSendToFlame\\SSH_key\\" + sSSHKey + ".PPK testuser@" + sIPFlame + " find //usr//discreet//clip//stonefs \\! -name '*.*' -type d -maxdepth 1"]


Hm, hoffe das bringt uns irgendwie weiter. Bin weiterhin für Hinweise tierisch dankbar! [@gerold:wx hab ich nicht ausprobiert... wohin wird in Deinem Beispiel ohne ConsolenFenster eigentlich der print-Befehl abgesetzt?]

Gruß
Philipp
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 5. Oktober 2007, 12:29

2d23d hat geschrieben:@gerold:wx hab ich nicht ausprobiert... wohin wird in Deinem Beispiel ohne ConsolenFenster eigentlich der print-Befehl abgesetzt?
Hallo Philipp!

Das dürfte es erklären: http://www.python-forum.de/topic-5721.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Freitag 5. Oktober 2007, 12:47

@Gerold: Aha.
Meinst Du, dass es in meinem Fall vielleicht an GTK / pyGTK liegen kann, oder hab ich noch nen Fehler gemacht? Ne Idee?

Gruß
Philipp
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 5. Oktober 2007, 13:16

Hallo Philipp!

Mit einem normalen Kommandozeilenbefehl funktioniert es. Mit Plink.exe nicht. Das ist wahrscheinlich ein Angriffspunkt für das SSH-Protokoll, der damit umgangen wird. Ich weiß es aber nicht.

Vielleicht kannst du damit dieses Verhalten umgehen: http://pypi.python.org/pypi/paramiko

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 5. Oktober 2007, 13:44

gerold hat geschrieben:Mit einem normalen Kommandozeilenbefehl funktioniert es. Mit Plink.exe nicht. Das ist wahrscheinlich ein Angriffspunkt für das SSH-Protokoll, der damit umgangen wird. Ich weiß es aber nicht.
Und warum sollte dass mit ``python.exe`` dann doch gehen und mit ``pythonw.exe`` nicht?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Freitag 5. Oktober 2007, 14:28

Hi,
bei mir funktioniert es auch mit einem "normalen Kommandozeilenbefehl" nicht.

Code: Alles auswählen

cmd = ["D:\\usr\\local\\Blender\\blender.exe -h"]
test = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE)
gibt mit python.exe was aus, mit pythonw.exe nicht...
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Montag 8. Oktober 2007, 09:27

Tschuldigung, wenn ich das Thema nochmal wieder aufwärme...
Ich habe noch immer keine Lösung gefunden und wollte mal fragen, ob das eventuell einen Bugreport wert ist (or is it a feature?). Wenn ja, welche mailinglist/welcher tracker wäre da die richtige?

Gruß
Philipp
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 8. Oktober 2007, 10:07

2d23d hat geschrieben:Ich habe noch immer keine Lösung gefunden
Hallo Philipp!

Du musst schon auch ein wenig daran mitarbeiten.

1. Funktioniert dieses Beispiel? http://www.python-forum.de/viewtopic.php?p=78978#78978
Und schreib jetzt nicht, dass du wxPython nicht zum Testen installieren willst.

2. Ist paramiko keine Alternative? Funktioniert es mit paramiko nicht?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Montag 8. Oktober 2007, 10:27

Du musst schon auch ein wenig daran mitarbeiten.
Gerne, wusste nur nicht, was ich noch machen soll... :)

2. Ist paramiko keine Alternative? Funktioniert es mit paramiko nicht?
Wenn mich jetzt nicht alles täuscht, hatte ich schon ausgeschlossen, dass es _NUR_ was mit ssh zu tun hat, denn 2 posts drüber hab ich mal ein Beispiel probiert (lokal, ohne ssh) und das ging auch schon nicht...aber notfalls probier ich auch das nochmal aus...
1. Funktioniert dieses Beispiel? http://www.python-forum.de/viewtopic.php?p=78978#78978
Und schreib jetzt nicht, dass du wxPython nicht zum Testen installieren willst.
ich probiers jetzt mal...

Danke auf jeden Fall und bis gleich...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 8. Oktober 2007, 10:57

Hallo

Ich verstehe das jetzt nicht ganz.

Meine Tests mit ``Popen`` funktionieren nur mehr sporadisch. Teilweise bekomme ich eine Meldung "Ungültiges Handle". Aber genaues kann ich nicht sagen, da ich es nicht schaffe, die Meldung irgendwohin auszugeben, so dass man diese länger als eine Zehntelsekunde sieht.

Andererseits funktioniert ein Testaufruf innerhalb der wxPython-Demo (suche nach "process") mit dieser Kommandozeile: ``J:\Programme\PuTTY\plink.exe -batch -load gps.gp "ls -al"`` immer.

Ich habe das jetzt in einem Testprogramm umgesetzt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx
import sys


app = wx.PySimpleApp(redirect = True)
#cmd = "echo Hallo Welt"
cmd = 'J:\Programme\PuTTY\plink.exe -batch -load gps.gp "ls -al"'
proc = wx.Process()
proc.Redirect()
wx.Execute(cmd, wx.EXEC_SYNC, proc)
print proc.GetInputStream().read()
proc.Destroy()

app.MainLoop()
Wenn du die Kommandozeile (cmd) an deine Umstände anpasst -- funktioniert dieses Beispiel dann bei dir?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
2d23d
User
Beiträge: 14
Registriert: Mittwoch 12. September 2007, 11:15

Montag 8. Oktober 2007, 11:42

Hi Gerold,
danke für Dein Nachforschen. Also meine Tests haben ergeben, dass mit man mit wx und Popen auch nur dann glücklich wird, wenn man nicht pythonw.exe benutzt...(Ausgabe mit python.exe OK, mit pythonw.exe bekomme ich einen Fehler, den ich auch nicht debuggen kann, da er nur kurz aufblinkt...)

mit wx.Process() sieht die Sache schon stabiler aus...das wäre also ne Alternative...würde aber auch bedeuten, die gesamte GUI mit allen events etc. nochmal umzuschreiben, wx in der gesamten Firma nachzuinstallieren (mein Admin guckt mich schon ganz sauer an :) ), hm...denk ich nochmal drüber nach...vielleicht kann ich doch mit dem zweiten, nutzlosen Fenster leben?

aber nochmal ganz zurück zum Anfang: kein Popen mit pythonw.exe? > So langsam könnte man vielleicht sagen, dass es so ist, oder? Vielleicht sollte man trotzdem mal irgendwo Bescheid sagen, damit es in Zukunft vielleicht funktioniert? auch mit GTK... gibts da ne mailingliste / bugtracker?

Gruß
Philipp
Antworten