2012-05-11 3 views
6

Java를 1.6에서 1.7 x64 (Windows 7)로 업그레이드 한 후 갑자기 Python 2.7의 subprocess 모듈을 통해 java.exe를 시작할 수 없습니다. 단지에 사용되는 다음과 같은 스크립트가 작동 :왜 파이썬은 서브 프로세스를 통해 java.exe를 실행할 수 없습니까?

나는 또한 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 

, 응용 프로그램, 그리고 명령 쉘에서 실행할 수 있습니다 :

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

지금은이 같은 실패 .

여기에 무슨 문제가 있습니까?

편집 : 내가 파이썬에서 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 응용 프로그램이 해당 변수를 사용할 수 있습니다.

는 다시, 자바는 하는 경우 트릭을 할 것입니다 서브 프로세스 호출에 '자바'하지만 모든 것을 제거 경로에있을 수 있습니다. 시도해볼 여유가 없습니다.

+1

C : \ Windows \ system32 \ java.exe와 관련성이있는 이유는 'PATH'를 통해 보통 java.exe를 찾는 방법이므로 직접 의존하지 않습니다. 실행 경로. 그러나 당신은 WoW64에 관해 뭔가있을 것입니다, 나는 조사 할 것입니다, 고마워요. – aknuds1

+2

당신은 뭔가에있었습니다. 'False'는 32 비트 파이썬에서 다음을 실행할 때 출력되지만, 64 비트 파이썬에서는'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는 없습니다. – aknuds1

+0

왜 SO의 모든 시간 응답 중에서 최고 투표자 중 한 명이 투표하지 않습니까? –

0

PATH 환경 변수가 jre의 bin 경로 주위에 따옴표가 있는지 확인할 수도 있습니다. 파이썬은 그들을 좋아하지 않습니다 :

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> 
관련 문제