2010-09-21 18 views
13

Tengo un script en Python que es en este directorio:Python: el subproceso con diferente directorio de trabajo

work/project/test/a.py 

Dentro a.py, utilizo subprocess.POPEN para poner en marcha el proceso de otro directorio,

work/to_launch/file1.pl, file2.py, file3.py, ... 

Python Código:

subprocess.POPEN("usr/bin/perl ../to_launch/file1.pl") 

y en trabajo/proyecto /, escribo el siguiente ing

[[email protected] project]python test/a.py, 

error "file2.py, 'No existe el fichero o directorio'"

¿Cómo puedo añadir que work/to_launch/, por lo que estos archivos dependientes file2.py se pueden encontrar?

+5

puede probar argumento usin cwd en Popen: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

En Python usar 'import os 'then' os.chdir ('/ tmp/yourdirectory') 'Eso configurará el directorio actual para su script python. –

Respuesta

15

Su código no funciona, porque la ruta relativa se ve relativamente a su ubicación actual (un nivel por encima de test/a.py).

En sys.path[0] tiene la ruta de su script que se está ejecutando actualmente.

Usa os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) con relPathToLaunch = '../to_launch/file1.pl' para obtener la ruta absoluta a tu file1.pl y ejecuta perl con ella.

EDITAR: si usted quiere poner en marcha file1.pl de su directorio y después vuelva de nuevo, sólo recuerda su directorio de trabajo actual y luego cambiar de nuevo:

origWD = os.getcwd() # remember our original working directory 

os.chdir(os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch)) 
subprocess.POPEN("usr/bin/perl ./file1.pl") 
[...] 

os.chdir(origWD) # get back to our original working directory 
+0

lo siento, pero file1.pl se puede encontrar y ejecutar. porque estoy ejecutando python bajo el directorio "/ work/project", no bajo el directorio "work/project/test". El problema es que el archivo2, archivo 3, que invoca el archivo1.pl no se puede encontrar. – pepero

+0

Bueno, entonces parece ser un problema de Perl en su archivo1.pl? – eumiro

+0

Hola, eumiro, gracias por tu respuesta. Sin embargo, no puede resolver el problema, porque todos los demás archivos file1.pl, etc. no están bajo el directorio actual de trabajo de python, sino que todos están bajo el directorio /..../to_launch/. p.ej. dentro de file1.pl, llama directamente a "./file3.py", y no puedo cambiar esta ruta en file1.pl. Para resumir, permítanme volver a formular mi pregunta: en Python, ¿cómo llamar a otro programa que se ejecuta en otro directorio de trabajo? – pepero

0

podría utilizar este código para establecer la directorio actual:

import os 
os.chdir("/path/to/your/files") 
+0

bueno, vale, probé os.chdir, y este comando parece cambiar mi directorio de trabajo actual. El problema es que tengo que lanzar varios subprocesos, y cada subproceso llamará al código en los directorios respectivos, como work/to_launch/A/file1.pl, file2.py, etc. y work/to_launch/B/file1.pl ., archivo2, archivo3. ... Además, si uso chdir, ¿cómo cambio? Quiero decir dentro de mi programa, con frecuencia me inyecto estos comandos para cambiar de ida y vuelta. no es muy bueno Supongo que Python debería tener alguna forma que fácilmente podría usarse para agregar un directorio dependiente. – pepero

+0

también, estoy iniciando varios procesos hijos, por lo que no estoy seguro de cómo debería funcionar esto para los procesos primarios y secundarios – pepero

+0

así que supongamos que file1.pl tiene una ruta /a/b/c/file1.pl abs así que ejecute su comando de esta manera .chdir ("a/b/c /") y luego ejecutar file1.pl Creo que debería funcionar. – anijhaw

1

Utilizar rutas relativas a la escritura, no el directorio de trabajo actual

os.path.join(os.path.dirname(__file__), '../../to_launch/file1.pl) 

Véase también mi respuesta a Python: get path to file in sister directory?

+0

HI, Adam, el problema es que el archivo1.py necesitará llamar a otros archivos, que están todos bajo otro directorio de trabajo. por favor mira mi comentario arriba. Gracias de todos modos por su publicación. – pepero

Cuestiones relacionadas