2008-10-17 16 views
6

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

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

Cuando salida de una cadena usando " ".join(args) y pegar que en mi intérprete de comandos, la JVM lanza bien, y todo funciona. Todo funciona si uso os.system(" ".join(args)) en mi script de Python, también.

Pero el siguiente fragmento 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é pasa? ¿Por qué funciona copiar/pegar en el shell o usar os.system(), pero no os.execvp()?

Respuesta

11

Si su variable "classpath" 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 comandos en los espacios (a menos que sean escapados o citados). De hecho, la línea de comando se transfiere al programa llamado como una matriz (a diferencia de Windows), y la JVM espera encontrar un elemento con solo "-classpath" seguido de otro elemento con la ruta de clase.

Se puede ver la diferencia por sí mismo llamando al siguiente pequeño script Python en lugar de la JVM:

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

Puede simplemente usar "print sys.argv", ya que str (list()) == repr (list()) –

+0

@John Millikin: Gracias, eliminé el redundante repr(). – CesarB

0

Asegúrese de que no está confiando en el desarrollo del forro en la ruta de clases. P.ej. "~/my.jar" se expandirá por el intérprete de órdenes en una llamada al sistema os, pero no, creo en una llamada os.execvp.