6

在将 Java 从 1.6 升级到 1.7 x64(在 Windows 7 上)后,我突然无法再通过 Python 2.7 的subprocess模块启动 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确实存在,是一个应用程序,并且可以从命令 shell 执行。

这里出了什么问题?

编辑: 我发现我可以C:\Program Files\Java\jre7\bin\java.exe从 Python 开始,所以 C:\Windows\system32\java.exe一定是一些奇怪的伪快捷方式,尽管从技术上讲是一个 Windows 应用程序。1.7 版一定搞砸了,因为我刚刚确认 1.6 版没问题。

4

2 回答 2

9

假设“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”之外的所有内容就可以解决问题。尝试不会有什么坏处。

于 2012-05-11T20:03:47.627 回答
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>
于 2013-07-29T12:47:05.920 回答