2012-05-11 3 views
6

Javaを1.6から1.7 x64(Windows 7)にアップグレードした後、突然Python 2.7のsubprocessモジュール経由でjava.exeを起動できなくなりました。使用される次のスクリプトは、ちょうど仕事:私もC:\Windows\system32\java.exeが実際に存在しないことを確認しました、アプリケーションであり、コマンドシェルから実行することができPythonでサブプロセス経由で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 

import subprocess 
subprocess.check_call([r"C:\Windows\system32\java.exe"]) 

は、今ではこのように失敗します。

ここで何が問題になるのですか?

EDIT: 私は、PythonからC:\Program Files\Java\jre7\bin\java.exeを開始することができますので、C:\Windows\system32\java.exeは技術的には、Windowsのアプリケーションもののいくつかの奇妙な擬似ショートカットでなければならないことを私を見つけました。私がちょうどバージョン1.6が正常であることを確かめたので、バージョン1.7は何とかそれを台無しにしていたに違いない。

+1

本当にリンクではありませんか? – Marcin

+1

@Marcinファイルプロパティによれば、ファイルタイプは 'Application(.exe)'です。 – aknuds1

+0

それは...変だ。 – Marcin

答えて

8

「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はちょうど た場合 トリックを行いますサブプロセスの呼び出しで「Javaの以外のすべてを削除し、PATHにあるかもしれません。それは試して傷つけることはできません。

+1

C:\ Windows \ system32 \ java.exeが私に関係していた理由は、通常はPATH経由でjava.exeを見つける方法です。実行可能パス。しかし、あなたはWoW64に関する何かにいるかもしれません、私は調査します、ありがとう。 – aknuds1

+2

あなたは何かに乗っていました。 'False'は32ビットのPythonで次を実行するときに出力されますが、64ビットのPythonでは' True'が出力されます: 'python.exe -c" import os.path; os.path.exists(r'C:\ windows \ system32 \ java.exe ') "を実行します。 64ビットWindows上の32ビットアプリケーションは、C:\ Windows \ System32からjava.exeがないC:\ Windows \ SysWOW64にリダイレクトされるようです。 – aknuds1

+0

なぜこれで全員の投票でトップに投票したのですか? –

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> 
関連する問題