使用Python子进程而不是os.system

时间:2011-06-10 17:41:27

标签: python shell subprocess os.system

按照Ignacio(Python remove spaces and append)的建议,我尝试将以下命令转换为使用subprocess而不是os.system

脚本:os.system("/usr/local/bin/growlnotify -n emesene -a emesene -t """+title+""" -m """+text+"""""")

我想:subprocess.call(['/usr/local/bin/growlnotify', '-n emesene', '-a emesene', '-t ""+title+"""', '-m """+text+"""""'], shell=True)

但它不起作用。任何想法如何让这个工作?我看过Python文档并看过这里,但我无法弄明白!

BTW titletext是来自emesene messengers通知系统的变量

2 个答案:

答案 0 :(得分:5)

而不是

subprocess.call(['/usr/local/bin/growlnotify', '-n emesene', '-a emesene', '-t ""+title+"""', '-m """+text+"""""'], shell=True)

使用

subprocess.call(['/usr/local/bin/growlnotify', '-n',  'emesene', '-a', 'emesene', '-t', title, '-m', text], shell=True)

在shell命令中,每个地方都有一个不带引号的空格,拆分另一个列表项。

shlex.split函数可用于将shell样式命令转换为Subproces期望的排序列表。

答案 1 :(得分:4)

使用列表传递命令时,您不希望“shell = True”。 我本来只会在Jeremy Banks的帖子上发表评论(因为他对shlex.split的陈述最值得注意),但我现在没有代表这样做:/

subprocess.call(['/usr/local/bin/growlnotify', '-n',  'emesene', '-a', 'emesene', '-t', title, '-m', text])