Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash命令在Python中不起作用_Python_Google Assistant Sdk_Google Assist Api - Fatal编程技术网

Bash命令在Python中不起作用

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

我正在尝试从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 -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()