Bash命令在Python中不起作用
我正在尝试从Python或Perl执行下一个bash命令:Bash命令在Python中不起作用,python,google-assistant-sdk,google-assist-api,Python,Google Assistant Sdk,Google Assist Api,我正在尝试从Python或Perl执行下一个bash命令: googlesamples-assistant-pushtotalk --credentials /home/jsti/.config/google-oauthlib-tool/credentials.json --device-model-id 'pbx-assista' --device-id 'pbx' -i /tmp/google_audio1314_in.wav -o /tmp/google_audio1314_out.wav
googlesamples-assistant-pushtotalk --credentials /home/jsti/.config/google-oauthlib-tool/credentials.json
--device-model-id 'pbx-assista' --device-id 'pbx' -i /tmp/google_audio1314_in.wav -o /tmp/google_audio1314_out.wav -v
基本上,这个想法是发送一个音频到谷歌助手,之后,它应该回答我的音频与另一个音频。我应该收到一个音频文件作为谷歌助手的回应,但我没有收到。没有错误,但文件未到达
如果我在终端中执行该命令,它将正常工作
有人知道这个命令发生了什么吗
代码如下:
#!/usr/bin/env python
import sys
from asterisk.agi import *
import subprocess
command = "googlesamples-assistant-pushtotalk"
oauth_dir = "/home/jsti/.config/google-oauthlib-tool/credentials.json"
audio_in = "/tmp/google_audio1314_in.wav"
audio_out = "google_audio1314_out.wav"
agi = AGI()
agi.verbose("python agi started")
callerId = agi.env['agi_callerid']
agi.verbose("call from %s" % callerId)
while True:
args = [command, '--credentials', oauth_dir, '--device-model-id', '"pbx-assista"', '--device-id', '"pbx"', '-i', audio_in, '-o', audio_out, '-v' ]
subprocess.Popen(args)
去掉
“pbx assista”
和“pbx”
周围的双引号
这里使用的代码实际上不会等待子流程退出(也不会查看它是否成功,因此无法检测和报告错误) 更改:
subprocess.Popen(args)
…到
subprocess.check_call(args)
……或者
p = subprocess.Popen(args)
p.wait()
此外,您还需要将
“pbx”
更改为“pbx”
;原始bash版本中的双引号是语法性的,就像Python版本中的单引号一样——除了语法性的引号之外,您不需要文字性的引号。(Bash允许在不需要使用语法引号来防止不必要的扩展、使其他语法上有意义的字符成为文字等时,可以选择性地省略语法引号;对于Python,在定义字符串时,它们始终是必需的)我已经在问题中包含了代码。很抱歉,我注意到您没有使用wait()
、call()
,或者任何其他实际上让子流程在继续之前完成的操作。我特别建议子流程。检查调用(args)
以在发生故障时抛出异常,而不是让它们不被注意。如果在while
循环后,程序真的结束了,并且您从未等待过程序完成,那么。。。好。。。当然,他们无法在脚本结束之前完成。现在代码到此结束,因为这是最重要的部分,它仍然不起作用。我尝试了下一个代码,但没有成功:process=subprocess.Popen(…)process.wait()@CharlesDuffy,你是对的。代码可以通过使用“wait()”或“call()”正常工作。谢谢你,打得好,我完全没听清楚那里的字面意思。也就是说,我相信OP也可能有问题,因为他们没有在脚本退出之前等待子进程完成。我无法摆脱双引号。它们是命令的一部分。@Stiben,这个答案实际上是正确的:如果您的命令在shell中真正写为--device id“pbx”
,则不,双引号不是shell传递给它运行的可执行文件的参数列表的一部分;shell将这些引号视为语法引号,并在启动命令之前删除它们。要使您的引号在shell中成为文字,它必须是——设备id“pbx”
,显然,您没有这样做。@JohnKugelman,您是否倾向于编辑以涵盖其他问题,还是我应该添加一个竞争性的答案?@CharlesDuffy。
p = subprocess.Popen(args)
p.wait()