2010-09-21 11 views
13

J'ai un script python qui est dans ce répertoire:Python: le sous avec un répertoire différent de travail

work/project/test/a.py 

intérieur a.py, j'utilise subprocess.POPEN pour lancer le processus d'un autre répertoire,

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

Python Code:

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

et sous le travail/projet /, je tape ce qui suit ing

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

erreur « file2.py, « Aucun fichier ou répertoire » »

Comment puis-je ajouter work/to_launch/, de sorte que se trouvent ces fichiers dépendants file2.py?

+5

vous pouvez essayer l'argument usin CWD dans Popen: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

En Python 'utiliser import os 'then' os.chdir ('/ tmp/yourdirectory') 'Cela va définir le répertoire courant pour votre script python. –

Répondre

15

Votre code ne fonctionne pas, parce que le chemin relatif est vu par rapport à votre position actuelle (un niveau au-dessus du test/a.py).

Dans sys.path[0] vous avez le chemin de votre script en cours d'exécution.

Utilisez os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) avec relPathToLaunch = '../to_launch/file1.pl' pour obtenir le chemin absolu à votre file1.pl et exécuter perl avec elle.

EDIT: si vous voulez lancer file1.pl de son répertoire, puis revenir en arrière, rappelez-vous votre répertoire de travail courant puis revenez:

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

Je suis désolé, mais file1.pl peut être trouvé et exécuté. parce que je cours le python sous le répertoire "/ work/project", pas sous le répertoire "work/project/test". Le problème est le fichier 2, fichier 3, qui sont appelés par file1.pl ne peut pas être trouvé. – pepero

+0

Eh bien, alors il semble que ce soit un problème de Perl dans votre fichier1.pl? – eumiro

+0

Salut, eumiro, merci pour votre réponse. Cependant, il ne peut pas résoudre le problème, car tous les autres fichiers file1.pl, etc. ils ne sont pas sous le répertoire de travail python actuel, ils sont tous supposés dans le répertoire /..../to_launch/. par exemple. à l'intérieur de file1.pl, il appelle directement "./fichier3.py", et je ne peux pas changer ce chemin dans file1.pl. Pour résumer, permettez-moi de reformuler ma question: en python, comment appeler un autre programme, qui fonctionne sous un autre répertoire de travail? – pepero

0

Vous pouvez utiliser ce code pour définir la répertoire courant:

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

bien, ok, j'ai essayé os.chdir, et cette commande semble changer mon répertoire de travail actuel. Le problème est que je dois lancer plusieurs sous-processus, et chaque sous-processus appellera le code dans les répertoires respectifs, tels que work/to_launch/A/file1.pl, file2.py, etc. et work/to_launch/B/file1.pl ., fichier2, fichier3. ... Aussi, si j'utilise chdir, comment puis-je changer? Je veux dire dans mon programme, j'injecte souvent ces commandes pour changer de va-et-vient. ce n'est pas très bon. Je suppose que python devrait avoir un moyen qui pourrait facilement être utilisé pour ajouter un répertoire dépendant. – pepero

+0

aussi, je lance plusieurs processus enfants, donc je ne suis pas sûr de savoir comment cela devrait fonctionner pour les processus parents et enfants – pepero

+0

alors supposons que file1.pl a un chemin absolu /a/b/c/file1.pl alors lancez votre commande comme ceci .chdir ("a/b/c /"), puis exécutez file1.pl Je pense que cela devrait fonctionner. – anijhaw

1

Utilisez des chemins relatifs au script, pas le répertoire de travail courant

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

Voir aussi ma réponse à Python: get path to file in sister directory?

+0

HI, Adam, le problème est que file1.py devra appeler d'autres fichiers, qui se trouvent tous dans un autre répertoire de travail. S'il vous plaît voir mon commentaire ci-dessus. Merci tout de même pour votre post. – pepero