将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很好。
答案 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>