2010-09-21 6 views
13

ich einen Python-Skript, das in diesem Verzeichnis ist:Python: Unterprozess mit unterschiedlichem Arbeitsverzeichnis

work/project/test/a.py 

Innen a.py, ich subprocess.POPEN, den Prozess aus einem anderen Verzeichnis zu starten,

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

Python Code:

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

und unter Arbeit/Projekt /, gebe ich die folgen

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

Fehler "file2.py 'Keine solche Datei oder das Verzeichnis'"

Wie kann ich work/to_launch/, so dass diese abhängigen Dateien file2.py gefunden werden kann?

+5

Sie können auch usin cwd Argument in Popen versuchen: http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat

+0

In Python 'import os 'then' os.chdir ('/ tmp/deinVerzeichnis') 'Das wird das aktuelle Verzeichnis für dein Python-Skript setzen. –

Antwort

15

Ihr Code funktioniert nicht, da der relative Pfad relativ zu Ihrem aktuellen Standort angezeigt wird (eine Ebene über der test/a.py).

In sys.path[0] haben Sie den Pfad Ihres derzeit laufenden Skripts.

Verwenden Sie os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch) mit relPathToLaunch = '../to_launch/file1.pl', um den absoluten Pfad zu Ihrem file1.pl zu erhalten und damit zu laufen.

EDIT: wenn Sie wollen file1.pl aus seinem Verzeichnis starten und dann zurück, kehren Sie die aktuelle Arbeitsverzeichnis erinnern und wechseln Sie dann wieder:

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

Es tut mir leid, aber datei1.pl kann gefunden und ausgeführt werden. weil ich den Python unter dem "/ work/project" -Verzeichnis ausführe, nicht unter "work/project/test" -Verzeichnis. Das Problem ist die Datei2, Datei 3, die von file1.pl aufgerufen werden, kann nicht gefunden werden. – pepero

+0

Nun, dann scheint es ein Perl-Problem in Ihrer Datei1.pl zu sein? – eumiro

+0

Hallo, Eumiro, danke für deine Antwort. Es kann jedoch das Problem nicht lösen, da alle anderen Dateien file1.pl etc. nicht im aktuellen Python-Arbeitsverzeichnis liegen, sondern alle unter /..../to_launch/ Verzeichnis annehmen. z.B. Innerhalb von file1.pl ruft es direkt "./file3.py" auf, und ich kann diesen Pfad in file1.pl nicht ändern. Um eine kurze Zusammenfassung zu machen, lassen Sie mich meine Frage rephasieren: In Python, wie man ein anderes Programm aufruft, das unter einem anderen Arbeitsverzeichnis läuft? – pepero

0

Sie diesen Code verwenden könnten die festlegen aktuelles Verzeichnis:

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

Nun, ok, ich habe os.chdir ausprobiert, und dieser Befehl scheint mein aktuelles Arbeitsverzeichnis zu ändern. Das Problem ist, dass ich mehrere Subprozesse aufspielen muss und jeder Subprozess den Code in entsprechenden Verzeichnissen wie work/to_launch/A/file1.pl, file2.py usw. und work/to_launch/B/file1.pl aufruft ., Datei2, Datei3. ... Auch wenn ich Chdir benutze, wie wechsle ich zurück? Ich meine, in meinem Programm injiziere ich häufig diese Befehle, um hin und her zu wechseln. es ist nicht sehr gut. Ich nehme an, Python sollte einen Weg haben, der leicht verwendet werden könnte, um abhängige Verzeichnisse hinzuzufügen. – pepero

+0

auch, ich bin mehrere Kinder-Prozesse starten, so bin ich mir nicht sicher, wie dies für Eltern und Kinder-Prozesse – pepero

+0

funktionieren soll, also file1.pl hat ABS Pfad /a/b/c/file1.pl also führen Sie Ihren Befehl wie diese os .chdir ("a/b/c /") und dann file1.pl ausführen Ich denke, es sollte funktionieren. – anijhaw

1

Nutzungspfade relativ zum Skript, nicht das aktuelle Arbeitsverzeichnis

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

Siehe meine Antwort auf Python: get path to file in sister directory?

+0

HI, Adam, das Problem ist Datei1.py muss andere Dateien aufrufen, die alle unter einem anderen Arbeitsverzeichnis sind. Bitte beachten Sie meinen Kommentar oben. Vielen Dank für Ihren Beitrag. – pepero