2010-01-10 72 views
4

我试图调试的第三方Python 2.5脚本让我感到困惑。脚本的相关部分是:Python的subprocess.Popen()和源代码

 proc = subprocess.Popen(
       "ls && source houdini_setup", 
       shell = True, 
       executable = "/bin/bash", 
       ) 

有一个守护进程监听端口5001并运行上述脚本。当脚本运行时,它失败,出现以下错误:

_cygwin.py 
houdini_setup 
... (more files) ... 
/bin/sh: line 0: source: houdini_setup: file not found 

有很多存在的文件houdini_setup,由LS所示,事实上,如果我改变“来源”为“猫”在上面的脚本,该脚本按预期打印houdini_setup的内容。而且,在一个真正的bash shell中运行上述命令,也可以在不投诉的情况下生成文件。

有没有人有任何想法这里发生了什么?

+0

我找到的空怪 – Mauli 2010-01-10 21:02:32

+0

发生我复制粘贴它调试;删除行stdin = null;'不幸的是没有任何区别。 – user168715 2010-01-10 21:04:15

回答

7

source使用$PATH找到您传递给它的内容,如果不指定目录。尝试source ./houdini_setup

+0

这样做,谢谢! 在真实的bash shell中,即使当$ PATH不包含所述目录时,源文件在当前目录中也不需要./。任何想法为什么它需要在Popen()? – user168715 2010-01-10 21:09:10

+0

这可能与shell执行实际上是sh而不是bash,尽管该行传递给函数调用有关。 – LeafStorm 2010-01-10 21:14:00

+0

这是我的经验,它*是*需要。总是。 – 2010-01-10 21:15:44

2

您可以使用strace来帮助诊断这样的问题。在这种情况下与-ff标志运行它遵循子会发现,你的代码是在错误的地方寻找“houdini_setup”:

stat64("/usr/local/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 
stat64("/usr/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 
stat64("/bin/houdini_setup", 0xbf989e60) = -1 ENOENT (No such file or directory) 

这可能导致您检查文档中的source内置。

0

也许你可以只使用bash本身做的工作,如果它是你的系统上:从我试图代码

os.popen("/bin/bash -l -c 'source $HOME/.yourfiletobesourced'") 
+1

您应该仍然使用'subprocess'模块来做到这一点(使用'shell = True'关键字集)。 – 2012-12-06 23:01:00