Python的subprocess.Popen()和source

时间:2010-01-10 20:55:03

标签: python bash

我正在尝试调试的第三方Python 2.5脚本让我陷入困境。脚本的相关部分是:

       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所示,实际上如果我在上面的脚本中将“source”更改为“cat”,脚本会按预期打印houdini_setup的内容。此外,在一个真正的bash shell中运行上面的命令也可以在没有投诉的情况下获取文件。

有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:7)

如果您没有指定目录,

source会使用$PATH来查找传递给它的内容。试试source ./houdini_setup

答案 1 :(得分: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内置文件的文档。

答案 2 :(得分:0)

如果您的系统上有可用的bash,可以使用bash本身来完成这项任务:

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