Usando os.execvp en Python
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 ()
?
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.