【问题标题】:Bash command not working in PythonBash命令在Python中不起作用
【发布时间】:2018-11-01 10:29:30
【问题描述】:

我正在尝试从 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 Assistant 的响应,但我没有收到。没有错误但文件没有到达。

如果我在终端中执行该命令,它可以正常工作。

有人知道这个命令发生了什么吗?

这是代码:

#!/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)

【问题讨论】:

  • 我已经在问题中包含了代码。抱歉来晚了
  • 我注意到您没有使用wait()call() 或其他任何实际上让子进程在继续之前完成的东西。我特别建议subprocess.check_call(args) 在发生故障时抛出异常,而不是让它们被忽视。
  • 如果在while 循环之后你的程序真的结束了,并且你从来没有等待你的程序完成,那么......好吧......当然 i> 他们将无法在脚本结束之前完成。
  • 代码到此结束,因为这是最重要的部分,但仍然无法正常工作。我尝试了下一个代码,但它不起作用: process = subprocess.Popen(...) process.wait()
  • @CharlesDuffy,你是对的。通过使用“wait()”或“call()”,代码可以正常工作。谢谢。

标签: python google-assistant-sdk google-assist-api


【解决方案1】:

去掉"pbx-assista""pbx" 周围的双引号。

args = [command, '--credentials', oauth_dir, '--device-model-id', 'pbx-assista', '--device-id', 'pbx', '-i', audio_in, '-o', audio_out, '-v']

【讨论】:

  • 好电话——我完全错过了那里的文字引号。也就是说,我相信 OP可能会遇到问题,因为他们没有等待子进程在脚本退出之前完成。
  • 我无法摆脱双引号。它们是命令的一部分。
  • @Stiben,这个答案实际上是正确的:如果你的命令在shell中真正写成--device-id "pbx"no,双引号不是字面意思其中一部分是 shell 传递给它运行的可执行文件的参数列表; shell 将这些引号视为句法,并在启动命令之前将其删除。要在 shell 中使您的引号文字化,它需要是 --device-id '"pbx"',显然,您没有这样做。
  • @JohnKugelman,您是否倾向于编辑以涵盖其他问题,或者我应该添加竞争答案?
  • @CharlesDuffy 去吧。
【解决方案2】:

这里使用的代码实际上并没有等待子进程退出(并且不看是否成功,因此无法检测和报告错误)。

变化:

subprocess.Popen(args)

...到...

subprocess.check_call(args)

...或...

p = subprocess.Popen(args)
p.wait()

另外,您需要将 '"pbx"' 更改为 'pbx';原始 bash 版本中的双引号是语法,就像 Python 版本中的单引号一样——除了语法引号之外,您不需要文字引号。 (Bash 可选地允许在不需要句法引号时省略它们以防止不必要的扩展,使其他句法上重要的字符变为文字等;使用 Python,在定义字符串时它们始终是强制性的)

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多