2010-09-21 20 views
13

Mam skrypt Pythona, który jest w tym katalogu:Python: podproces z innego katalogu roboczego

work/project/test/a.py 

Wewnątrz a.py, używam subprocess.POPEN aby uruchomić proces z innego katalogu,

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

Python Kod:

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

oraz w ramach pracy/projektu /, wpisuję następujące ing

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

błąd „file2.py«Nie ma takiego pliku lub katalogu»”

Jak mogę dodać work/to_launch/, tak że można znaleźć te pliki zależne file2.py?

+5

można spróbować usin cwd argumentu w POPEN: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

W Pythonie użyć 'os import 'then' os.chdir ('/ tmp/yourdirectory') 'To ustawi bieżący katalog dla twojego skryptu Pythona. –

Odpowiedz

15

Twój kod nie działa, ponieważ względna ścieżka jest widoczna w stosunku do Twojej bieżącej lokalizacji (jeden poziom powyżej test/a.py).

W katalogu sys.path[0] znajduje się ścieżka do aktualnie uruchomionego skryptu.

Użyj os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) z relPathToLaunch = '../to_launch/file1.pl', aby uzyskać absolutną ścieżkę do swojej file1.pl i uruchomić z nią perl.

EDIT: jeśli chcesz uruchomić file1.pl ze swojego katalogu, a następnie wrócić, ale należy pamiętać bieżący katalog roboczy, a następnie przełączyć się z powrotem:

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

Przykro mi, ale plik1.pl można znaleźć i uruchomić. ponieważ używam pythona w katalogu "/ work/project", a nie w katalogu "work/project/test". Problemem jest plik2, plik 3, który jest wywoływany przez plik1.pl nie można znaleźć. – pepero

+0

Cóż, to wydaje się być problemem Perla w twoim file1.pl? – eumiro

+0

Cześć, eumiro, dziękuję za odpowiedź. Jednak nie może rozwiązać problemu, ponieważ wszystkie inne pliki file1.pl, itp. Nie znajdują się w bieżącym katalogu roboczym Pythona, zamiast tego wszystkie zakładają w katalogu /..../to_launch/. na przykład wewnątrz pliku file1.pl bezpośrednio wywołuje "./file3.py" i nie mogę zmienić tej ścieżki w file1.pl. Aby krótko podsumować, Pozwól mi zmienić moje pytanie: w python, jak wywołać inny program, który działa w innym katalogu roboczym? – pepero

0

Można użyć tego kodu, aby ustawić bieżący katalog:

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

dobrze, ok, próbowałem os.chdir, a to polecenie wydaje się zmieniać mój bieżący katalog roboczy. Problem polega na tym, że muszę uruchomić kilka podprocesów, a każdy podproces wywoła kod w odpowiednich katalogach, takich jak work/to_launch/A/file1.pl, file2.py, itp. I work/to_launch/B/file1.pl ., file2, file3. ... Również jeśli używam chdir, jak mogę zmienić? Chodzi mi o to, że w moim programie często wprowadzam te polecenia, aby zmieniać się w tę iz powrotem. nie jest bardzo dobry. Przypuszczam, że Python powinien mieć jakiś sposób, który może być łatwo użyty do dodania katalogu zależnego. – pepero

+0

również uruchamiam kilka procesów potomnych, więc nie mam pewności, jak to powinno działać dla procesów macierzystych i potomnych – pepero

+0

, więc załóżmy, że file1.pl ma ścieżkę abs /a/b/c/file1.pl, więc uruchom swoją komendę jak ten os .chdir ("a/b/c /") a następnie uruchom plik file1.pl Myślę, że powinien działać. – anijhaw

1

Używaj ścieżek względnych do skryptu, a nie aktualny katalog roboczy

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

Zobacz też moja odpowiedź na Python: get path to file in sister directory?

+0

HI, Adam, problem polega na tym, że file1.py będzie musiał wywoływać inne pliki, które znajdują się w innym katalogu roboczym. zobacz mój komentarz powyżej. Dziękuję wszystkim za Twój post. – pepero

Powiązane problemy