Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';t Python是否通过子进程执行java.exe?_Java_Python_Windows_Subprocess - Fatal编程技术网

为什么可以';t Python是否通过子进程执行java.exe?

为什么可以';t Python是否通过子进程执行java.exe?,java,python,windows,subprocess,Java,Python,Windows,Subprocess,在将Java从1.6升级到1.7x64(在Windows 7上)之后,我突然无法通过Python 2.7的子流程模块启动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>

在将Java从1.6升级到1.7x64(在Windows 7上)之后,我突然无法通过Python 2.7的
子流程
模块启动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
回溯(最近一次呼叫最后一次):
文件“\tst.py”,第2行,在
子进程检查\u调用([r“C:\Windows\system32\java.exe”])
文件“C:\Python27\lib\subprocess.py”,第506行,在check\u调用中
retcode=call(*popenargs,**kwargs)
调用中第493行的文件“C:\Python27\lib\subprocess.py”
返回Popen(*popenargs,**kwargs)。等待()
文件“C:\Python27\lib\subprocess.py”,第679行,在\uuu init中__
错误读取,错误写入)
文件“C:\Python27\lib\subprocess.py”,第896行,在执行子进程中
startupinfo)
WindowsError:[错误2]系统找不到指定的文件
我还确认
C:\Windows\system32\java.exe确实存在,是一个应用程序,可以从命令shell执行

这里出了什么问题

编辑:
我发现我可以从Python中启动
C:\ProgramFiles\Java\jre7\bin\Java.exe
,所以
C:\Windows\system32\Java.exe
一定是某种奇怪的伪快捷方式,虽然从技术上讲是Windows应用程序。1.7版一定是把事情搞砸了,因为我刚刚确认1.6版没问题。

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

但是,即使存在“C:\Windows\System32\java.exe”,在Win64下32位进程也可能看不到它。Windows在这里以向后兼容性的名义做了一些有趣的事情,您可能想看看

找到您正在寻找的Java版本(可能有很多)可能是一项吃力不讨好的任务。如果您不特别关心找到哪种Java,请尝试Java_HOME环境变量。它并不总是存在,但如果存在,那么就完成了,这可能是找到JVM的最可移植的方式。如果它不存在,设置它就不会出错,许多Java应用程序都可以使用该变量


同样地,Java也可能在这个路径上,在这种情况下,除去子流程调用中除“Java”之外的所有内容就可以了。试试也无妨。

您可能还需要检查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>

你确定这不是一个链接吗?@Marcin根据文件属性,文件类型是
Application(.exe)
。如果你能进一步调查,你的编辑将是一个很好的答案。如果你无法进行更多的调查,请考虑将它作为一个答案来回答。@ Marcin Gonna向java开发人员提交反馈,希望它们能回到我身边。运行FSUTIL,这不是硬链接的原因:\\Windows \Stave3\javaEXE与我有关,这是我通常如何通过代码>路径< /C>找到Java.EXE,我不直接依赖于那个可执行路径。但你很可能对WoW64有所了解,我会调查的,谢谢。你对一些事情有所了解<当使用32位Python执行以下操作时,会打印code>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,而C:\Windows\SysWOW64中没有java.exe。为什么这不是所有时间里投票最多的答案之一呢?我也遇到了这个错误。对我来说,直接使用路径“C:\Program Files\Java\jre7\bin\Java.exe”是有效的(64位,1.7.0_67-b01)。仅使用“java”(从路径)不会返回任何输出,即使我对subprocess发出了合法命令。check_output(…)