Bash 命令在 Python 中不起作用
Bash command not working in Python
我正在尝试从 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
基本上,我的想法是向 Google 助理发送一个音频,之后,它应该用另一个音频回答我这个音频。我应该收到一个音频文件作为 Google 助理的回复,但我没有收到。没有错误,但文件没有到达。
如果我在终端中执行该命令,该命令将正常运行。
有人知道这个命令发生了什么吗?
这是代码:
#!/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"
两边的双引号。
args = [command, '--credentials', oauth_dir, '--device-model-id', 'pbx-assista', '--device-id', 'pbx', '-i', audio_in, '-o', audio_out, '-v']
此处使用的代码实际上并没有等待子进程退出(并且不查看它是否成功,因此无法检测和报告错误)。
变化:
subprocess.Popen(args)
...到...
subprocess.check_call(args)
...或...
p = subprocess.Popen(args)
p.wait()
此外,您需要将 '"pbx"'
更改为 'pbx'
;原始 bash 版本中的双引号是句法引号,就像 Python 版本中的单引号一样——除了句法引号外,您不需要文字引号。 (Bash 可选地允许在不需要时省略语法引号,以防止不需要的扩展,使其他语法上重要的字符成为文字,等等;对于 Python,它们总是强制性的定义字符串时)
我正在尝试从 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
基本上,我的想法是向 Google 助理发送一个音频,之后,它应该用另一个音频回答我这个音频。我应该收到一个音频文件作为 Google 助理的回复,但我没有收到。没有错误,但文件没有到达。
如果我在终端中执行该命令,该命令将正常运行。
有人知道这个命令发生了什么吗?
这是代码:
#!/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"
两边的双引号。
args = [command, '--credentials', oauth_dir, '--device-model-id', 'pbx-assista', '--device-id', 'pbx', '-i', audio_in, '-o', audio_out, '-v']
此处使用的代码实际上并没有等待子进程退出(并且不查看它是否成功,因此无法检测和报告错误)。
变化:
subprocess.Popen(args)
...到...
subprocess.check_call(args)
...或...
p = subprocess.Popen(args)
p.wait()
此外,您需要将 '"pbx"'
更改为 'pbx'
;原始 bash 版本中的双引号是句法引号,就像 Python 版本中的单引号一样——除了句法引号外,您不需要文字引号。 (Bash 可选地允许在不需要时省略语法引号,以防止不需要的扩展,使其他语法上重要的字符成为文字,等等;对于 Python,它们总是强制性的定义字符串时)