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実際に存在し、アプリケーションであり、コマンド シェルから実行できることも確認しました。

ここで何がうまくいかないのですか?

編集:C:\Program Files\Java\jre7\bin\java.exe Python から 開始できることがわかったのでC:\Windows\system32\java.exe、技術的には Windows アプリケーションですが、奇妙な疑似ショートカットである必要があります。バージョン 1.6 が正常であることを確認したばかりなので、バージョン 1.7 は何らかの形でそれを台無しにしたに違いありません。

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 に答える