Pregunta

Tengo una pregunta sobre el uso de os.execvp en Python. Tengo el siguiente bit de código que se usa para crear una lista de argumentos:

args = [ "java"
       , classpath
       , "-Djava.library.path=" + lib_path()
       , ea
       , "-Xmx1000m"
       , "-server"
       , "code_swarm"
       , params
       ]

Cuando imprimo una cadena usando " " .join (args) y péguelo en mi indicador de shell, la JVM se inicia bien y todo funciona. Todo funciona si uso os.system (" " .join (args)) en mi script de Python, también.

Pero el siguiente bit de código no funciona:

os.execvp("java", args)

Me sale el siguiente error:

Unrecognized option: -classpath [and then the classpath I created, which looks okay]
Could not create the Java virtual machine.

Entonces, ¿qué da? ¿Por qué copiar / pegar en el shell o usar os.system () funciona, pero no os.execvp () ?

¿Fue útil?

Solución

Si tu " classpath " La variable contiene, por ejemplo, "classpath foo.jar", no funcionará, ya que está pensando que el nombre de la opción es "classpath foo.jar". Dividirlo en dos argumentos: [..., " -classpath " ;, classpath, ...].

Las otras formas (copiar y pegar y sistema ()) funcionan porque el shell divide la línea de comando en los espacios (a menos que se escapen o se citen). De hecho, la línea de comando se pasa al programa llamado como una matriz (a diferencia de en Windows), y la JVM espera encontrar un elemento con solo " -classpath " seguido de otro elemento con el classpath.

Puedes ver la diferencia por ti mismo llamando al siguiente pequeño script de Python en lugar de JVM:

#!/usr/bin/python
import sys
print sys.argv

Otros consejos

Asegúrese de no confiar en la expansión de shell en su classpath. P.ej. " ~ / my.jar " será expandido por el shell en una llamada al sistema os., pero no, creo en una llamada os.execvp.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top