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

akn*_*ds1 6 python java windows subprocess

将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"])
Run Code Online (Sandbox Code Playgroud)

现在它失败了:

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
Run Code Online (Sandbox Code Playgroud)

我也确认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很好.

小智 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"之外的所有东西都可以解决问题.试试也不会有害.

  • 你有所作为.使用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重定向到C:\ Windows\SysWOW64,其中没有java.exe. (2认同)