2011-01-10 15 views
5

Estoy tratando de ejecutar scripts Python, Ruby, C, C++ y Java desde un programa java, y se me sugirió Processbuilder como una buena forma de ejecutar los scripts. Por lo que entiendo, Processbuilder principalmente ejecuta archivos nativos (.exe en Windows, etc.). Sin embargo, he escuchado algunas cosas sobre la ejecución de archivos de scripts (no nativos) con Processbuilder. Desafortunadamente, todo lo que encuentro sobre el tema es increíblemente vago.ejecutando scripts a través de processbuilder

Si alguien pudiera aclarar una forma de ejecutar scripts no nativos como Python, Ruby, etc. ¡estaría muy agradecido!

Respuesta

6

Puede consultar el ProcessBuilder documentation over at Sunoracle, pero básicamente, puede ejecutar el intérprete para el lenguaje de scripting y pasar el script que desea ejecutar en él.

Por ejemplo, digamos que usted tiene un script en /home/myuser/py_script.py, y es python en /usr/bin/

class ProcessRunner 
{ 
    public static void main(String [] args) 
    { 
     ProcessBuilder pb = new ProcessBuilder("/usr/bin/python", "/home/myuser/py_script.py"); 
     Process p = pb.start(); 
    } 
} 

Un ejemplo muy básico, se puede obtener más elegante con el cambio del directorio de trabajo y cambiar el medio ambiente.

También puede construir ProcessBuilder con una matriz String o un subtipo de List<String>. El primer elemento en la lista debe ser el programa/ejecutable que desea ejecutar, y todos los elementos siguientes son argumentos para el programa.

String pbCommand[] = { "/usr/bin/python", "/home/myuser/py_script.py" }; 
ProcessBuilder pb = new ProcessBuilder(pbCommand); 
Process p = pb.start(); 
+0

funciona! ¡Muchas gracias! – Curlystraw

0

Para evitar tener que introducir manualmente toda la ubicación de la secuencia de comandos, que también puede dar lugar a problemas de portabilidad, esto es lo que hice:

String pwd = System.getProperty("user.dir"); 

ProcessBuilder pb = new ProcessBuilder("/usr/bin/python", pwd+'/'+scriptName, arg1, arg2); 
Process p = pb.start(); 
Cuestiones relacionadas