2010-09-21 47 views
13

我有一個python腳本,它是此目錄下:的Python:子與不同的工作目錄

work/project/test/a.py 

裏面a.py,我用subprocess.POPEN從另一個目錄中啓動進程,

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

的Python代碼:

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

and under work/project /,I type following荷蘭國際集團

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

錯誤「file2.py,‘沒有這樣的文件或目錄’」

如何新增work/to_launch/,讓這些相關文件​​可以找到?

+5

你可以嘗試在全光照POPEN CWD說法:http://stackoverflow.com/questions/1685157/python-popen-working-directory-argument – Ayrat 2012-03-29 13:16:42

+0

在Python使用'進口OS '然後'os.chdir('/ tmp/yourdirectory')'這會爲你的python腳本設置當前目錄。 – 2014-01-04 22:30:32

回答

15

您的代碼不起作用,因爲相對路徑相對於您當前的位置(比test/a.py高一級)。

sys.path[0]你有當前正在運行的腳本的路徑。

使用os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch)relPathToLaunch = '../to_launch/file1.pl'得到的絕對路徑的file1.pl和運行perl它。

編輯:如果你想從它的目錄file1.pl推出,然後返回回來,只記得你的當前工作目錄,然後切換回:

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

我很抱歉,但可以找到並運行file1.pl。因爲我在「/ work/project」目錄下運行python,而不是在「work/project/test」目錄下運行。問題是無法找到由file1.pl調用的file2,file 3。 – pepero 2010-09-21 16:58:05

+0

那麼,它似乎是在你的file1.pl的Perl問題? – eumiro 2010-09-21 18:42:47

+0

嗨,eumiro,謝謝你的回答。但是,它不能解決問題,因爲所有其他文件file1.pl等都不在當前python工作目錄下,而是全部假設在/..../to_launch/目錄下。例如在file1.pl中,它直接調用「./file3.py」,並且我無法在file1.pl中更改此路徑。總結一下,讓我重新回到我的問題:在Python中,如何調用另一個工作目錄下運行的另一個程序? – pepero 2010-09-22 08:30:18

0

您可以使用此代碼設置當前目錄:

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

好吧,好吧,我試過os.chdir,而這個命令似乎改變了我目前的工作目錄。問題是我不得不推出幾個子進程,並且每個子進程都會調用相應目錄中的代碼,例如work/to_launch/A/file1.pl,file2.py等和work/to_launch/B/file1.pl 。,file2,file3。 ...另外,如果我使用chdir,我該如何改變?我的意思是在我的程序中,我經常注入這些命令來回變換。它不是很好。我想Python應該有一些方法可以很容易地用來添加依賴目錄。 – pepero 2010-09-21 17:20:24

+0

另外,我啓動了幾個子進程,所以我不知道這應該如何工作的父母和子進程 – pepero 2010-09-21 17:46:30

+0

因此,假設file1.pl有abs路徑/a/b/c/file1.pl所以運行你的命令就像這個操作系統.chdir(「a/b/c /」)然後執行file1.pl我認爲它應該可以工作。 – anijhaw 2010-09-21 18:38:09

1

相對於腳本中使用的路徑,而不是當前的工作目錄

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

另見我的回答Python: get path to file in sister directory?

+0

HI,Adam,問題是file1.py需要調用其他文件,這些文件都在另一個工作目錄下。請參閱我上面的評論。謝謝你對你的帖子也一樣。 – pepero 2010-09-22 16:40:17