【问题标题】:Use subprocess in Python在 Python 中使用子进程
【发布时间】:2015-02-03 15:55:45
【问题描述】:

我正在用 Python 编写一个小程序,用于录制音频并同时打印一些文本。

但是我的打印一直执行到录音完成。 你能帮我解决这个问题吗?

import picamera, subprocess, os, sys

a1 = "arecord -f cd -D plughw:0 -d 10 a.wav"
subprocess.call(a1,shell= True)
print("Audio record is only for 10sec")

【问题讨论】:

  • 好吧,您可以将print 放在subprocess.call() 的正下方 - 它不会等待arecord 结束 :) 否则,您可以使用threads 同时运行它.
  • @IgorHatarist 但在实际实践中,它正在等待音频结束然后打印文本..我完全按照你说的做
  • 嗯,我无法复制它。你确定如果你交换包含subprocess.callprint的行,记录完成后消息仍然不会显示?

标签: python subprocess audio-recording popen


【解决方案1】:

您正在使用subprocess.call,它会阻止:

运行 args 描述的命令。 等待命令完成,然后返回 returncode 属性。

您可以使用Popen 对象,它不会阻塞:

proc = subprocess.Popen(a1.split())
# code will proceed

# use proc.communicate later on

或者您可以使用Thread 分别运行两件事(然后在它自己的上下文中生成一个进程):

import picamera, subprocess, os, sys
import threading

def my_process():
    a1 = "arecord -f cd -D plughw:0 -d 10 a.wav"
    subprocess.call(a1,shell= True)
thread = threading.Thread(target=my_process)
thread.start()
print("Audio record is only for 10sec")

【讨论】:

  • 当我使用 proc = subprocess.Popen(a1.spilt()) 而不是 subprocess.call(a1,shell= True) 时,它向我显示错误 AttributeError: 'str' object has no attribute 'spilt'
  • 这里不需要线程。除非任何管道被重定向,否则不应调用.communicate(),而是使用.wait()
  • @J.F.Sebastian 你能编辑我的编码,使subprocess.Popen 没有错误
  • spilt 是一个明显的错字。请改用a1.split(),如答案所示。
猜你喜欢
  • 2011-11-21
  • 2015-02-03
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多