Daten an Subprocess übergeben bzw. im Subprocess 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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jep, die CHM-Hilfe-Datei nutzte ich auch sehr oft... Die Referenz als PDF ist auch ok, aber langsamer...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,
also im Interpreter funktioniert das mit der Datenübergabe, aber wenn
ich das Script mit Py2exe ausführbar mache, dann bekomme ich nachfolgende Fehlermeldungen. Habe als Kommentar daneben geschrieben, was in den betreffenden Programmzeilen steht.
Ohne ...,stdin=subprocess.PIPE) läuft auch die Py2exe Version, aber
dann habe ich ja keine Datenübergabe. Die Fehler in 'subprocess.pyc'
verstehe ich nicht. Habe mir die .pcy angesehen, aber da stehen nur Hyroglyphen drin und außerdem hat die subprocess.pyc im 'dist' Ordner nur 605 Zeilen. Hat einer ne Idee ??

Gruss, Seven

Code: Alles auswählen

---------------------------------------------------------------------
Traceback (most recent call last):
  File "Modul_Handler.py", line 434, in ?  '		# Lookat() = Hauptfunktion (Loop)
  File "Modul_Handler.py", line 174, in Lookat	# init_proz1() (s.u.)
  File "Modul_Handler.py", line 71, in init_proz1	# gv.pz1 = subprocess.Popen('... Modul_1.exe',stdin = subprocess.PIPE)
  File "subprocess.pyc", line 533, in __init__
  File "subprocess.pyc", line 607, in _get_handles
  File "subprocess.pyc", line 634, in _make_inheritable
WindowsError: [Errno 6] Das Handle ist ungültig
---------------------------------------------------------------------

Code: Alles auswählen

def init_proz1(event=None):
    gv.neustart1 = True
    gv.neust1 = 0
    if gv.pz1.poll() == 0:
        gv.pz1 = subprocess.Popen('... Modul_1.exe',stdin = subprocess.PIPE)
    else:
        kill(gv.pz1.pid)
        gv.pz1 = subprocess.Popen('... Modul_1.exe',stdin = subprocess.PIPE)

def kill(pid):
    handle = win32api.OpenProcess(1, 0, pid)
    return (0 != win32api.TerminateProcess(handle, 0))
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du hast den anderen Thread http://www.python-forum.de/viewtopic.php?t=4941 verfolgt, oder?

Was hast du überhaupt vor??? Lagerst du Teile deines Programms aus und machst mit py2exe daraus Ausführbare Dateien??? Das ist sicherlich nicht der optimale Weg...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

jens hat geschrieben:Du hast den anderen Thread http://www.python-forum.de/viewtopic.php?t=4941 verfolgt, oder?

Was hast du überhaupt vor??? Lagerst du Teile deines Programms aus und machst mit py2exe daraus Ausführbare Dateien??? Das ist sicherlich nicht der optimale Weg...
@1)Ich sehe in dem zitierten Thread nicht die Antwort auf mein Problem. Sollte cPickle dran schuld sein ?

@2)Ich weiss, dass viele hier die Importmethode favorisieren, ich arbeite aber aus gutem Grund mit parallel laufenden Modulen. Die Module müssen wirklich parallel arbeiten und wenn ein Fehler auftritt, beendet der Modul-Handler nur dieses eine Modul und startet es neu. Tritt der Fehler wiederholt auf, wird es ganz gestopt und der Support benachrichtigt. Die einzelnen Module rufen ihrerseits wieder Subprozesse auf, z.B. Lame ode eine Audiobearbeitungssoftware für aufwendige Effekte. Das ganze ist eine Art Miniserver für Audiobearbeitung / Konvertierung etc.. Läuft unter Zope und bis auf die neuen Fehlermeldungen läuft alles rund, inklusive ErrorLogs und Tages-, Wochen-, und Monatsprotokollen als Excel-Tabellen.

Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Versuch mal zusätzlich zum stdin=subprocess.PIPE "stdout=subprocess.PIPE" und "stderr=subprocess.PIPE" mit reinzusetzen. Ich könnte mir vorstellen dass py2exe keine vernünftigen Deskriptoren für stdout und stderr zur Verfügung stellt die dupliziert werden könnten...

Ganz davon abgesehen: die Fehlermeldung bezieht sich auf die Zeile in der Quelldatei von subprocess.pyc, also subprocess.py. Da ist rund um die angegenenen Zeilen folgende Funktionen:

Code: Alles auswählen

def _get_handles(self, stdin, stdout, stderr):
            """Construct and return tupel with IO objects:
            p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
            """
            if stdin == None and stdout == None and stderr == None:
                return (None, None, None, None, None, None)

            p2cread, p2cwrite = None, None
            c2pread, c2pwrite = None, None
            errread, errwrite = None, None

            if stdin == None:
                p2cread = GetStdHandle(STD_INPUT_HANDLE)
            elif stdin == PIPE:
                p2cread, p2cwrite = CreatePipe(None, 0)
                # Detach and turn into fd
                p2cwrite = p2cwrite.Detach()
                p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
            elif type(stdin) == types.IntType:
                p2cread = msvcrt.get_osfhandle(stdin)
            else:
                # Assuming file-like object
                p2cread = msvcrt.get_osfhandle(stdin.fileno())
            p2cread = self._make_inheritable(p2cread)

            if stdout == None:
                c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
            elif stdout == PIPE:
                c2pread, c2pwrite = CreatePipe(None, 0)
                # Detach and turn into fd
                c2pread = c2pread.Detach()
                c2pread = msvcrt.open_osfhandle(c2pread, 0)
            elif type(stdout) == types.IntType:
                c2pwrite = msvcrt.get_osfhandle(stdout)
            else:
                # Assuming file-like object
                c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
            c2pwrite = self._make_inheritable(c2pwrite) # Fehler hier, 607.

            if stderr == None:
                errwrite = GetStdHandle(STD_ERROR_HANDLE)
            elif stderr == PIPE:
                errread, errwrite = CreatePipe(None, 0)
                # Detach and turn into fd
                errread = errread.Detach()
                errread = msvcrt.open_osfhandle(errread, 0)
            elif stderr == STDOUT:
                errwrite = c2pwrite
            elif type(stderr) == types.IntType:
                errwrite = msvcrt.get_osfhandle(stderr)
            else:
                # Assuming file-like object
                errwrite = msvcrt.get_osfhandle(stderr.fileno())
            errwrite = self._make_inheritable(errwrite)

            return (p2cread, p2cwrite,
                    c2pread, c2pwrite,
                    errread, errwrite)

        def _make_inheritable(self, handle):
            """Return a duplicate of handle, which is inheritable"""
            return DuplicateHandle(GetCurrentProcess(), handle,
                                   GetCurrentProcess(), 0, 1,
                                   DUPLICATE_SAME_ACCESS) # Fehler hier, 634.
Schaut also ganz danach aus dass das handle von stdout nicht dupliziert werden kann. Dagegen kannst Du aber wie gesagt durch obiges was tun.

--- Heiko.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

modelnine hat geschrieben:Versuch mal zusätzlich zum stdin=subprocess.PIPE "stdout=subprocess.PIPE" und "stderr=subprocess.PIPE" mit reinzusetzen. Ich könnte mir vorstellen dass py2exe keine vernünftigen Deskriptoren für stdout und stderr zur Verfügung stellt die dupliziert werden könnten... --- Heiko.
Das wars ! Voll in Schwarze getroffen modelnine, keine Fehlermeldungen mehr, danke ! Seven
Antworten