Seite 2 von 2

Verfasst: Freitag 20. Januar 2006, 21:36
von jens
Jep, die CHM-Hilfe-Datei nutzte ich auch sehr oft... Die Referenz als PDF ist auch ok, aber langsamer...

Verfasst: Dienstag 24. Januar 2006, 14:50
von snakeseven
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))

Verfasst: Dienstag 24. Januar 2006, 15:26
von jens
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...

Verfasst: Dienstag 24. Januar 2006, 17:08
von snakeseven
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

Verfasst: Dienstag 24. Januar 2006, 17:24
von modelnine
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.

Verfasst: Dienstag 24. Januar 2006, 19:55
von snakeseven
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