문제
사용에 대한 질문이 있습니다 os.execvp
파이썬에서. 인수 목록을 작성하는 데 사용되는 다음 코드가 있습니다.
args = [ "java" , classpath , "-Djava.library.path=" + lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ]
문자열을 사용하여 출력 할 때 " ".join(args)
그리고 그것을 내 쉘 프롬프트에 붙여 넣으면 JVM은 잘 발사되며 모든 것이 작동합니다. 내가 사용하면 모든 것이 작동합니다 os.system(" ".join(args))
내 파이썬 스크립트에서도.
하지만 다음과 같은 코드가 작동하지 않습니다.
os.execvp("java", args)
다음 오류가 발생합니다.
Unrecognized option: -classpath [and then the classpath I created, which looks okay] Could not create the Java virtual machine.
그래서 무엇을 제공합니까? 왜 껍질에 복사/붙여 넣기 또는 사용합니까? os.system()
일하지만 그렇지 않습니다 os.execvp()
?
해결책
"classpath"변수에 "-classpath foo.jar"가 포함 된 경우 옵션 이름이 "-classpath foo.jar"라고 생각하기 때문에 작동하지 않습니다. [..., "-classpath", classpath, ...].
다른 방법 (복사 및 붙여 넣기 및 System ())은 쉘이 공간에서 명령 줄을 분할하기 때문에 작동합니다 (탈출하거나 인용되지 않는 한). 명령 줄은 실제로 Windows와 달리 배열로 호출 프로그램으로 전달되며 JVM은 "-classpath"만있는 요소와 클래스 경로가있는 다른 요소를 찾을 것으로 기대합니다.
JVM 대신 다음 작은 파이썬 스크립트를 호출하여 자신의 차이점을 볼 수 있습니다.
#!/usr/bin/python
import sys
print sys.argv
다른 팁
클래스 경로에서 쉘 확장에 의존하지 않도록하십시오. 예를 들어 "~/my.jar"는 OS.System Call에서 쉘에 의해 확장되지만 os.execvp 호출을 믿지 않습니다.