2012-05-11 2 views
6

После обновления Java от 1,6 до 1,7 x 64 (в Windows 7) я внезапно не могу запустить java.exe через модуль subprocess Python 2.7. Следующий скрипт используется просто работать:Почему Python не запускает java.exe через подпроцесс?

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

Теперь он не так:

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 

Я также подтвердил, что C:\Windows\system32\java.exe действительно существует, это приложение, и может быть выполнена из командной оболочки ,

Что здесь не так?

EDIT: Я обнаружил, что я могу начать C:\Program Files\Java\jre7\bin\java.exe с Python, так C:\Windows\system32\java.exe должен быть какой-то загадочный псевдо-ярлык, хотя технически это приложение для Windows. Версия 1.7 должна была как-то испортить, так как я только что подтвердил, что версия 1.6 в порядке.

+1

Уверены ли вы, что это не ссылка? – Marcin

+1

@Marcin Согласно свойствам файла, тип файла - 'Application (.exe)'. – aknuds1

+0

Это ... странно. – Marcin

ответ

8

Предположим, что java.exe в каталоге «C: \ Windows \ System32» не является особо безопасным. Даже предположение о том, что система «C: \ Windows \ System32» в системе небезопасно: Windows может находиться на любом фиксированном диске на компьютере.

Но даже если есть «C: \ Windows \ System32 \ java.exe», это может быть не видно для 32-разрядных процессов под Win64. Windows делает некоторые интересные вещи здесь в целях обратной совместимости, вы можете посмотреть на http://en.wikipedia.org/wiki/WoW64.

Поиск версии Java, которую вы ищете - и может быть много - может быть неблагодарной задачей. Если вы не особенно заботитесь о , которую вы нашли Java, попробуйте переменную окружения JAVA_HOME. Это не всегда есть, но если это так, вы закончили, и это, вероятно, самый переносимый способ найти JVM. Если его нет, вы не ошибетесь, установив его, и многие Java-приложения могут использовать эту переменную.

Затем снова, Java просто может быть на пути, и в этом случае удаление Все, кроме «ява» в подпроцесса вызов будет делать трюк. Это не помешает попробовать.

+1

Причина, по которой C: \ Windows \ system32 \ java.exe имеет отношение ко мне, заключается в том, что я обычно нахожу java.exe через 'PATH', я напрямую не полагаюсь на это исполняемый путь. Но вы вполне можете быть в чем-то относительно WoW64, я буду исследовать, спасибо. – aknuds1

+2

Вы были на чем-то. 'False' печатается при выполнении следующего с 32-битным Python, но' True' для 64-битного Python: 'python.exe -c 'import os.path; print os.path.exists (r'C: \ windows \ system32 \ java.exe ') "'. По-видимому, 32-разрядные приложения на 64-битных Windows перенаправляются из C: \ Windows \ System32 в C: \ Windows \ SysWOW64, где нет java.exe. – aknuds1

+0

Почему этот один из лучших не голосовал за все ответы на SO? –

0

Возможно, вы также захотите проверить, имеет ли переменная окружения PATH кавычки "" вокруг пути bin в jre. Python не понравилось им:

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> 
Смежные вопросы