2012-05-11 4 views
6

Nach der Aktualisierung von Java von 1,6 auf 1,7 x64 (unter Windows 7) kann ich java.exe plötzlich nicht mehr über das Modul subprocess von Python 2.7 starten. Das folgende Skript nur verwendet arbeiten:Warum kann Python java.exe nicht über Subprozess ausführen?

import subprocess 
subprocess.check_call([r"C:\Windows\system32\java.exe"]) 

Jetzt schlägt es wie folgt aus:

Traceback (most recent call last): 
    File ".\tst.py", line 2, in <module> 
    subprocess.check_call([r"C:\Windows\system32\java.exe"]) 
    File "C:\Python27\lib\subprocess.py", line 506, in check_call 
    retcode = call(*popenargs, **kwargs) 
    File "C:\Python27\lib\subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "C:\Python27\lib\subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 896, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

ich auch bestätigt haben, dass C:\Windows\system32\java.exe tatsächlich existiert, ist eine Anwendung, und kann von der Kommando-Shell ausgeführt werden .

Was läuft hier falsch?

EDIT: ich gefunden habe, dass ich C:\Program Files\Java\jre7\bin\java.exe von Python starten können, so C:\Windows\system32\java.exe müssen einige seltsame pseudo-Verknüpfung obwohl technisch eine Windows-Anwendung sein. Version 1.7 muss es irgendwie vermasselt haben, da ich gerade bestätigt habe, dass Version 1.6 in Ordnung ist.

+1

Sind Sie sicher, dass es kein Link ist? – Marcin

+1

@Marcin Der Dateityp ist nach den Dateieigenschaften 'Application (.exe)'. – aknuds1

+0

Das ist ... komisch. – Marcin

Antwort

8

Angenommen, es gibt eine java.exe bei "C: \ Windows \ System32" ist keine besonders sichere Annahme. Selbst die Annahme, dass ein "C: \ Windows \ System32" auf dem System ist nicht sicher: Windows könnte auf festes Laufwerk auf dem Computer befinden.

Aber selbst wenn es ein "C: \ Windows \ System32 \ java.exe" gibt, ist dies möglicherweise für 32-Bit-Prozesse unter Win64 nicht sichtbar. Windows macht hier einige interessante Dinge im Namen der Abwärtskompatibilität. Vielleicht möchten Sie sich http://en.wikipedia.org/wiki/WoW64 ansehen.

Die Suche nach der Java-Version, nach der Sie suchen - und es kann viele geben - kann eine undankbare Aufgabe sein. Wenn Ihnen Java, das Sie finden, nicht besonders wichtig ist, versuchen Sie die Umgebungsvariable JAVA_HOME. Es ist nicht immer da, aber wenn es ist, sind Sie fertig und es ist wahrscheinlich die portabelste Art, eine JVM zu finden. Wenn es nicht vorhanden ist, können Sie nichts falsch machen, indem Sie es setzen, und viele Java-Anwendungen können diese Variable verwenden.

Dann wieder, Java nur könnte auf der PATH sein, in welchem ​​Fall die alles andere als ‚Java‘ in der subprocess Anruf entfernt wird den Trick. Es kann nicht schaden, es zu versuchen.

+1

Der Grund, warum C: \ Windows \ system32 \ java.exe für mich relevant war, ist, dass ich normalerweise java.exe über 'PATH 'finde, ich verlasse mich nicht direkt darauf ausführbarer Pfad Aber Sie können auf etwas in Bezug auf WoW64 gut sein, werde ich untersuchen, danke. – aknuds1

+2

Sie waren auf etwas. "False" wird gedruckt, wenn Folgendes mit 32-Bit-Python, aber "True" für 64-Bit-Python ausgeführt wird: "python.exe -c" import os.path; print os.path.exists (r'C: \ windows \ system32 \ java.exe ') "'. Anscheinend werden 32-Bit-Anwendungen unter 64-Bit-Windows von C: \ Windows \ System32 nach C: \ Windows \ SysWOW64 umgeleitet, wo es keine java.exe gibt. – aknuds1

+0

Warum ist das nicht eine der besten Antworten auf SO für alle Zeiten? –

0

Sie können auch überprüfen, ob die PATH-Umgebungsvariable in Anführungszeichen "" um den jour-bin-Pfad steht. Python scheint sie nicht zu mögen:

C:\bin>set PATH=C:\Python27;c:\Program Files\Java\jdk1.6.0_35\bin 

    C:\bin>python -c "import subprocess; subprocess.Popen(['java', '-version'], stderr=subprocess.PIPE)" 

    C:\bin>set PATH=C:\Python27;"c:\Program Files\Java\jdk1.6.0_35\bin" 

    C:\bin>python -c "import subprocess; subprocess.Popen(['java', '-version'], stderr=subprocess.PIPE)" 
    Traceback (most recent call last): 
    [...] 
    WindowsError: [Error 2] The system cannot find the file specified 

    C:\bin>