用Python subprocess替代os.system

1 投票
2 回答
1597 浏览
提问于 2025-04-16 19:20

根据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的文档,也在这里查过,但还是搞不定!

顺便说一下,titletext是来自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])

撰写回答