用Python subprocess替代os.system
根据Ignacio的建议(Python去除空格并追加),我想把下面的命令改成用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的文档,也在这里查过,但还是搞不定!
顺便说一下,title
和text
是来自emesene消息通知系统的变量。
2 个回答
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)
在你输入的命令中,每当有一个没有用引号括起来的空格时,就要分开成另一个列表项。
可以使用 shlex.split 这个函数,把类似命令行的输入转换成 Subprocess 需要的列表格式。
4
当你用列表来传递命令时,不要使用“shell=True”。我本来想在Jeremy Banks的帖子下评论这个(因为他提到的shlex.split非常重要),但我现在没有足够的声望去评论 :/
subprocess.call(['/usr/local/bin/growlnotify', '-n', 'emesene', '-a', 'emesene', '-t', title, '-m', text])