2010-09-21 46 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