2012-05-11 47 views
6

将Java从1.6升级到1.7 x64(在Windows 7上)后,我突然无法通过Python 2.7的subprocess模块启动java.exe。以前只是下面的脚本工作:为什么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确实存在,是一个应用程序,并可以在命令行中执行。

这里出了什么问题?

编辑: 我发现我可以从Python的开始C:\Program Files\Java\jre7\bin\java.exe,所以C:\Windows\system32\java.exe必须有一些怪异的伪快捷方式虽然在技术上一个Windows应用程序。 1.7版肯定会把它搞乱,因为我刚刚确认版本1.6没问题。

+1

你确定这不是一个链接? – Marcin

+1

@Marcin根据文件属性,文件类型是'Application(.exe)'。 – aknuds1

+0

这很奇怪。 – Marcin

回答

8

假设在“C:\ Windows \ System32”中有一个java.exe不是一个特别安全的假设。即使假设系统上有一个“C:\ Windows \ System32”也是不安全的:Windows可能驻留在计算机上的任何任意固定驱动器上。

但即使存在“C:\ Windows \ System32 \ java.exe”,对于Win64下的32位进程,这可能也不可见。 Windows以向后兼容的名义在这里做了一些有趣的事情,你可能想看看http://en.wikipedia.org/wiki/WoW64

寻找你正在寻找的Java版本 - 并且可能有很多 - 可以是一个不吃力的任务。如果您不特别关心哪个 Java找不到,请尝试使用JAVA_HOME环境变量。它并不总是存在,但如果是这样,那么你就完成了,这可能是找到JVM的最便携的方式。如果它不存在,通过设置它就不会出错,并且许多Java应用程序都可以使用该变量。

话又说回来,Java的只是可能是在PATH,在这种情况下删除的一切,但在子调用就可以了“的Java”。尝试不会伤害。

+1

C:\ Windows \ system32 \ java.exe与我有关的原因是它通常是通过'PATH'找到java.exe,我不直接依赖可执行路径。但是你可能会对WoW64有所了解,我会进行调查,谢谢。 – aknuds1

+2

你有什么东西。当使用32位Python执行以下内容时,会打印False,但对于64位Python,则为True:python.exe -c import os.path; print os.path.exists(r'C:\ windows \ SYSTEM32 \ java.exe的“)”'。显然,64位Windows上的32位应用程序将从C:\ Windows \ System32重定向到没有java.exe的C:\ Windows \ SysWOW64。 – aknuds1

+0

为什么不是所有时间答案中排名最高的一个呢? –

0

您可能还想检查PATH环境变量是否在jre的bin路径附近带有引号“”。 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> 
相关问题