2012-05-11 24 views
6

Después de actualizar Java de 1.6 a 1.7 x64 (en Windows 7), de repente ya no puedo ejecutar java.exe a través del módulo subprocess de Python 2.7. La siguiente secuencia de comandos se utiliza para sólo el trabajo:¿Por qué Python no puede ejecutar java.exe por subproceso?

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

Ahora se produce un error como este:

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 

También he confirmado que C:\Windows\system32\java.exe existe de hecho, es una aplicación, y puede ser ejecutado desde la consola de comandos .

¿Qué falla aquí?

EDIT: He descubierto que puedo comenzar C:\Program Files\Java\jre7\bin\java.exe desde Python, por lo C:\Windows\system32\java.exe debe haber alguna extraña pseudo-atajo aunque técnicamente una aplicación de Windows. La versión 1.7 debe haberlo estropeado de alguna manera, ya que confirmó que la versión 1.6 está bien.

+1

¿Estás seguro de que no es un enlace? – Marcin

+1

@Marcin De acuerdo con las propiedades del archivo, el tipo de archivo es 'Application (.exe)'. – aknuds1

+0

Eso es ... raro. – Marcin

Respuesta

8

Suponiendo que hay un java.exe en "C: \ Windows \ System32" no es una suposición particularmente segura. Incluso la suposición de que hay un "C: \ Windows \ System32" en el sistema no es seguro: Windows podría residir en cualquier unidad fija en la computadora.

Pero incluso si hay un "C: \ Windows \ System32 \ java.exe", esto podría no ser visible para los procesos de 32 bits bajo Win64. Windows hace algunas cosas interesantes aquí en nombre de la compatibilidad con versiones anteriores, es posible que desee consultar http://en.wikipedia.org/wiki/WoW64.

Encontrar la versión de Java que está buscando, y puede haber muchas, puede ser una tarea ingrata. Si no le interesa particularmente el que tiene Java, intente con la variable de entorno JAVA_HOME. No siempre está ahí, pero si lo está, terminaste y es probablemente la forma más portátil de encontrar una JVM. Si no está allí, no puedes equivocarte al configurarlo, y muchas aplicaciones Java pueden hacer uso de esa variable.

Por otra parte, Java simplemente podría estar en el camino, en cuyo caso la eliminación de del todo, pero 'java' en la llamada subproceso va a hacer el truco. No puede doler intentarlo.

+1

El motivo por el que C: \ Windows \ system32 \ java.exe fue relevante para mí es que así es como suelo encontrar java.exe a través de 'PATH', no confío directamente en eso ruta ejecutable. Pero es posible que estés interesado en algo relacionado con WoW64, voy a investigar, gracias. – aknuds1

+2

Estabas en algo. 'False' se imprime cuando se ejecuta lo siguiente con Python de 32 bits, pero' True' para Python de 64 bits: 'python.exe -c" import os.path; print os.path.exists (r'C: \ windows \ system32 \ java.exe ') "'. Aparentemente, las aplicaciones de 32 bits en Windows de 64 bits se redirigen de C: \ Windows \ System32 a C: \ Windows \ SysWOW64, donde no hay java.exe. – aknuds1

+0

¿Por qué esta no es una de las mejores respuestas de todos los tiempos en SO? –

0

Es posible que también desee comprobar si la variable de entorno PATH tiene comillas "" alrededor de la ruta bin de la jre. A Python no parece gustarle:

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> 
Cuestiones relacionadas