Windows 7 Problem mit subprocess.Popen Python 3.3

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.
Antworten
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
ich versuche heute schon länger, auf folgenden Fehler drauf zu kommen:

Code: Alles auswählen

process = subprocess.Popen(['dir'], stdout=subprocess.PIPE)
Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    process = subprocess.Popen(['dir'], stdout=subprocess.PIPE)
  File "C:\Python33\lib\subprocess.py", line 818, in __init__
    restore_signals, start_new_session)
  File "C:\Python33\lib\subprocess.py", line 1096, in _execute_child
    raise WindowsError(*e.args)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden
Hat jemand einen Tip für mich?

Danke!
BlackJack

@mcdaniels: Es gibt kein Programm mit dem Namen ``dir``. Das ist ein eingebauter Befehl in der Shell. Was willst Du denn *eigentlich* machen? Denn für das Auflisten von Dateinamen (und Metadaten) kann man auch das `os`-Modul mit `os.listdir()` und `os.stat()` verwenden.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Servus BlackJack:
Das Problem geht eigentlich von folgendem Programm aus. Du dürftest es u.U noch kennen, denn du warst damals so nett mich auf den richtigen Weg zu bringen:
(das mit dem 'dir" war dafür gedacht, um die Sache abzukürzen).

Code: Alles auswählen

import os
from glob import glob
from subprocess import PIPE, Popen


def main():
    for pdf_filename in glob('*.pdf'):
        target_path = os.path.join(
            'sig-pdf', os.path.splitext(pdf_filename)[0] + '_sig.pdf'
           )
        print (pdf_filename, '->', target_path)
    
        
        process = Popen(
            [
                'java',
                '-jar', 'PortableSigner.jar',
                '-b', 'de',
                '-c', 'Dieses Dokument wurde signiert.',
                '-i', 'Bildmarke.jpg',
                '-n',
                '-t', pdf_filename,
                '-o', target_path,
                '-s', 'zert.key',
                '-p', 'password'
            ]
            ,stdout=PIPE
        )
        output, _ = process.communicate()
        return_code = process.wait()


if __name__ == '__main__':
    main()
Fehler:
Traceback (most recent call last):
File "C:\Python33\lib\subprocess.py", line 1090, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finde
n

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\user\Desktop\Signieren\sig.py", line 40, in <module>
main()
File "C:\Users\user\Desktop\Signieren\sig.py", line 28, in main
,stdout=PIPE
File "C:\Python33\lib\subprocess.py", line 818, in __init__
restore_signals, start_new_session)
File "C:\Python33\lib\subprocess.py", line 1096, in _execute_child
raise WindowsError(*e.args)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finde
n
BlackJack

@mcdaniels: Offenbar liegt das ``java``-Programm nicht im %PATH% und kann deshalb nicht gefunden werden.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
das hatte ich auch schon vermutet. Leider ist es das nicht, denn java ist im Path und ist von "überall" im Dateisystem aufrufbar.

Der Knackpunkt ist also ein Problem beim Aufruf von java.exe, dann werd ich mal weiter suchen... unter Windows XP läuft die Sache übrigens.

LG
Daniel
BlackJack

@mcdaniels: Ist Java ganz sicher im Path von dem Benutzer der das ausführt? Funktioniert es wenn Du den Pfad von der ``java.exe`` komplett angibst?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
ja in den Umgebungsvariablen des Benutzers, der das Pythonscript startet ist der Pfad enthalten:

Code: Alles auswählen

C:\Program Files\Java\jre7\bin
Wäre das dann u.a. so aufzurufen (Auszug):

Code: Alles auswählen

 process = Popen(
            [
                'C:\\Program Files\\Java\\jre7\\bin\\java.exe',
Edit (auch so mag es mich nicht) - selber Fehler:

Code: Alles auswählen

 process = Popen(
            [
                'C:\Program Files\Java\jre7\bin\java.exe',
Edit2: Ich werd das jetzt noch auf anderen Maschinen testen und mich dann wieder melden.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
so wie es scheint gibt es bei Systemen ein Problem, bei denen auch vorhergehende Javaversionen installiert sind. (Java macht das ja ganz toll und deinstalliert bei einem Update die Vorversion nicht). Nun habe ich alle Javaversionen deinstalliert und danach ausschließlich die neue Version installiert.
Pfad ist allerdings der gleiche geblieben und es wurde auch vor der Installation die richtige (aktuellste) Javaversion aufgerufen (sagte zumindest java -version)

Es läuft jetzt wieder.

Allerdings verstehe ich nicht, warum man das Java-Programm (PortableSigner.jar) auch ohne die erwähnte Aktion problemlos durch Doppelklick starten konnte + die java.exe von überall (jedem Verzeichnis aus) aufrufbar war. (Pfad war also korrekt)

Mysterien von Oracle Java :-(

Sorry, dass ich das Python-Forum damit behelligt habe.

Danke!
Antworten