【发布时间】:2017-01-09 17:03:35
【问题描述】:
只要我安装了适当的程序 - fortune 在 Ubuntu 16.04 中默认不安装 - 我可以使用以下命令让我的计算机的语音到文本功能告诉我重新开始工作,并且然后给我读一封来自fortune的励志名言:
spd-say "get back to work and remember `fortune`"
这里我使用带有反引号的命令替换将调用fortune 命令的结果添加到要读取的文本字符串中。在 Python 中,我可以使用 subprocess 来执行此操作:
subprocess.call(['spd-say', 'get back to work'])
但是,用反引号替换命令似乎在这里不起作用:
subprocess.call(['spd-say', 'get back to work and remember `fortune`'])
在这种情况下,我会听到:“回去工作,记住财富”。我认为这是因为subprocess 传递的是单引号字符串,而这种命令替换只适用于双引号字符串。
我尝试了各种解决方案,包括使用双引号,单引号内的双引号,但我认为它仍然是传递带有双引号的单引号字符串而不是双引号字符串。
我也尝试将整个命令编写为单个字符串,并使用shlex.split() 将其分解:
import shlex
command = 'spd-say "get back to work and remember `fortune`"'
command_args = shlex.split(command)
但这给了我:
['spd-say', 'get back to work and remember `fortune`']
同样,没有双引号。
有没有办法强制将单个参数用双引号括起来(如果这确实是问题),或者以上述方式使用subprocess.call() 将fortune 命令的输出通过管道传输到spd-say?
【问题讨论】:
-
顺便说一句——我强烈建议您避免使用
shlex.split(),而是对您的列表进行硬编码:作为人类,您确切地知道您希望如何解析它们,所以您不妨以这种形式通过它们(另外,这意味着读者只需要知道 one 引用语法——Python 语法——VS 两种,Python 和 shell)。前一种方法很容易通过执行类似shlex.split("your-command --file=%s" % filename)的操作遇到麻烦,如果文件名包含空格,它可以扩展为多个参数,而['your-command', '--file=%s' % filename],这是明确的。
标签: python python-2.7 subprocess