Usando os.execvp em Python
Pergunta
Eu tenho uma pergunta sobre o uso os.execvp
em Python. Eu tenho o seguinte trecho de código que é usado para criar uma lista de argumentos:
args = [ "java" , classpath , "-Djava.library.path=" + lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ]
Quando eu mostrar uma string usando " ".join(args)
e colar isso em meu shell prompt, o JVM lançamentos bem, e tudo funciona. Tudo funciona se eu usar os.system(" ".join(args))
na minha Python roteiro, também.
e o seguinte trecho de código não funciona:
os.execvp("java", args)
Eu recebo o seguinte erro:
Unrecognized option: -classpath [and then the classpath I created, which looks okay] Could not create the Java virtual machine.
Então, o que dá? Por que copiar / colar no shell ou usando o trabalho os.system()
, mas não os.execvp()
?
Solução
Se a variável "classpath" contém, por exemplo, "-classpath foo.jar", não vai funcionar, uma vez que está pensando o nome da opção é "-classpath foo.jar". Dividi-lo em dois argumentos:. [... "-classpath", classpath, ...]
As outras formas (copiar e colar e do sistema) () trabalho porque o shell divide a linha de comando para os espaços (a menos que sejam escapou ou citado). A linha de comando é na verdade passado para o programa chamado como uma matriz (ao contrário no Windows), eo JVM está esperando para encontrar um elemento com apenas "-classpath" seguido por um outro elemento com o classpath.
Você pode ver a diferença para si mesmo, chamando o seguinte pequeno script Python em vez da JVM:
#!/usr/bin/python
import sys
print sys.argv
Outras dicas
Certifique-se de que você não está confiando em expansão shell no seu classpath. Por exemplo. "~ / My.jar" vai ser expandida pelo shell em uma chamada os.system, mas não, eu acredito em uma chamada os.execvp.