从python运行bash脚本

时间:2013-03-25 08:40:02

标签: python bash sh

我遇到了以下问题:

我有这个简单的脚本,叫做test.sh:

#!/bin/bash

function hello() {
    echo "hello world"
}
hello

当我从shell运行它时,我得到了预期的结果:

$ ./test2.sh
hello world

但是,当我尝试从Python(2.7。?)运行它时,我得到以下内容:

>>> import commands
>>> cmd="./test2.sh"
>>> commands.getoutput(cmd)
'./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected'

我相信它以某种方式从“sh”而不是bash运行脚本。我是这么认为的,因为当我用sh运行它时,我得到了同样的错误信息:

$ sh ./test2.sh
./test2.sh: 3: ./test2.sh: Syntax error: "(" unexpected

另外,当我从python运行带有前面“bash”的命令时,它可以工作:

>>> cmd="bash ./test2.sh"
>>> commands.getoutput(cmd)
'hello world'

我的问题是:为什么python选择使用sh而不是bash运行脚本,尽管我在脚本的开头添加了#!/bin/bash行?我怎样才能使它正确(我不想在python中使用前面的'bash',因为我的脚本是由我无法控制的远程机器从python运行的。)

谢谢!

1 个答案:

答案 0 :(得分:3)

似乎还有一些其他问题 - shbang和commands.getoutput应该正常显示在这里。将shell脚本更改为:

#!/bin/bash
sleep 100

再次运行该应用。检查ps f实际进程树是什么。 getoutput调用sh -c ...是正确的,但这不应该改变哪个shell执行脚本本身。

从问题中描述的最小测试中,我看到以下过程树:

11500 pts/5    Ss     0:00 zsh
15983 pts/5    S+     0:00  \_ python2 ./c.py
15984 pts/5    S+     0:00      \_ sh -c { ./c.sh; } 2>&1
15985 pts/5    S+     0:00          \_ /bin/bash ./c.sh
15986 pts/5    S+     0:00              \_ sleep 100

所以在隔离中,这可以按预期工作 - python调用sh -c { ./c.sh; },它由第一行(bash)中指定的shell执行。

确保您正在执行正确的脚本 - 因为您正在使用./test2.sh,请仔细检查您是否在正确的目录中并执行正确的文件。 (print open('./test2.sh').read()会回复您的期望吗?)