2010-09-21 14 views
13

Ho uno script python che si trova sotto questa directory:Python: il sottoprocesso con differenti directory di lavoro

work/project/test/a.py 

All'interno a.py, io uso subprocess.POPEN per avviare il processo da un'altra directory,

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

Python Codice:

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

e sotto lavoro/progetto /, digito il seguito ing

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

errore "file2.py, 'Nessun file o directory'"

Come posso aggiungere work/to_launch/, in modo che questi file dipendenti file2.py si possono trovare?

+5

si può provare argomento usin CWD in Popen: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

In Python usare 'os importazione 'then' os.chdir ('/ tmp/yourdirectory') 'Questo imposterà la directory corrente per il tuo script python. –

risposta

15

Il codice non funziona, poiché il percorso relativo viene visualizzato relativamente alla posizione corrente (un livello sopra lo test/a.py).

In sys.path[0] si ha il percorso dello script attualmente in esecuzione.

Utilizzare os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) con relPathToLaunch = '../to_launch/file1.pl' per ottenere il percorso assoluto su file1.pl ed eseguire perl con esso.

EDIT: se si desidera avviare file1.pl dalla sua directory e poi tornare indietro, basta ricordare la directory di lavoro corrente e quindi passare indietro:

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

mi dispiace, ma file1.pl può essere trovato ed eseguito. perché sto eseguendo il python nella directory "/ work/project", non nella directory "work/project/test". Il problema è il file2, il file 3, che sono chiamati da file1.pl non può essere trovato. – pepero

+0

Bene, allora sembra essere un problema Perl nel file1.pl? – eumiro

+0

Ciao, eumiro, grazie per la tua risposta. Tuttavia, non può risolvere il problema, perché tutti gli altri file file1.pl, ecc. Non sono sotto la directory di lavoro Python corrente, ma stanno tutti assumendo la directory /..../to_launch/. per esempio. all'interno di file1.pl, chiama direttamente "./file3.py" e non posso modificare questo percorso in file1.pl. Per riassumere brevemente, permettimi di ripetere la mia domanda: in python, come chiamare un altro programma, che è in esecuzione in un'altra directory di lavoro? – pepero

0

è possibile utilizzare questo codice per impostare la directory corrente:

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

bene, ok, ho provato os.chdir, e questo comando sembra cambiare la mia attuale directory di lavoro. Il problema è che devo lanciare diversi sottoprocessi, e ogni sottoprocesso chiamerà il codice nelle rispettive directory, come work/to_launch/A/file1.pl, file2.py, etc. e work/to_launch/B/file1.pl ., file2, file3. ... Anche se io uso chdir, come posso cambiare? Intendo nel mio programma, di solito iniettare questi comandi per cambiare avanti e indietro. non è molto buono Suppongo che Python dovrebbe avere un modo che potrebbe essere facilmente utilizzato per aggiungere una directory dipendente. – pepero

+0

inoltre, sto lanciando diversi processi figli, quindi non sono sicuro di come dovrebbe funzionare per i processi padre e figlio – pepero

+0

supponiamo quindi che file1.pl abbia percorso abs /a/b/c/file1.pl, quindi esegui il comando come questo .chdir ("a/b/c /") e quindi esegue file1.pl penso che dovrebbe funzionare. – anijhaw

1

utilizzare i percorsi relativi allo script, non è la directory di lavoro corrente

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

Vedi anche la mia risposta a Python: get path to file in sister directory?

+0

HI, Adam, il problema è file1.py dovrà chiamare altri file, che sono tutti sotto un'altra directory di lavoro. per favore vedi il mio commento sopra. Grazie ugualmente per il tuo post. – pepero