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()?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top