使用python运行shell脚本,Popen在python命令行和实际程序中的行为有所不同

时间:2012-03-19 21:42:11

标签: python popen

我有一个shell脚本,我想从python程序调用,但是根本不能使用以下代码(Popen已导入):

bf_dir = '/home/wireless'
bf_path = os.path.join(bf_dir, 'airdispatch.sh')
sh = Popen("sudo " + bf_path, shell=True)
print sh.communicate()

理想情况下,脚本将生成输出文件,但通过执行上述代码,这些文件不会出现,“打印”结果为[None, None]。我的猜测是“Popen”在某种程度上根本没有被执行,或者可能是我在这里犯了一个错误。所以我在python命令行中运行上面的代码,但事实证明一切正常。怎么可能呢?请帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

您没有从命令获得任何输出的原因是因为您没有告诉子进程打开管道进行通信...

from subprocess import Popen, PIPE

sh = Popen("sudo %s" % bf_path, shell=True, stdout=PIPE, stderr=PIPE)

现在,communication将返回stdout和stderr的输出。此外,如果需要密码输入,sudo可能会导致问题。

答案 1 :(得分:1)

使用shell = True并调用sudo听起来有风险(look here),我宁愿使用Popen列表而不是文本字符串。

sh = Popen(['sudo', bf_path], shell=False, stdout=PIPE, stderr=PIPE)