为什么Python不能通过子进程执行java.exe?

时间:2012-05-11 10:44:38

标签: java python windows subprocess

将Java从1.6升级到1.7 x64(在Windows 7上)后,我突然无法通过Python 2.7&#39} 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执行。

这里出了什么问题?

修改 我发现我可以从Python启动C:\Program Files\Java\jre7\bin\java.exe,所以C:\Windows\system32\java.exe必须是一些奇怪的伪捷径,尽管技术上是一个Windows应用程序。版本1.7必须以某种方式搞砸了,因为我刚刚确认版本1.6很好。

2 个答案:

答案 0 :(得分:8)

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

但即使存在“C:\ Windows \ System32 \ java.exe”,Win32下的32位进程也可能无法看到。 Windows在向后兼容性方面做了一些有趣的事情,你可能想看看http://en.wikipedia.org/wiki/WoW64

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

然后再一次,Java只是可能在PATH上,在这种情况下删除子进程调用中除了'java'之外的所有内容都可以解决问题。尝试不会有什么坏处。

答案 1 :(得分: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>