0

我正在树莓派上开发一个小型媒体播放器应用程序。所以这有两个主要功能。即收音机和文件播放器。如果在下面的文件播放器中输入代码:

        
        process = subprocess.Popen(['omxplayer',songs[0],'-o','local'],  stdout=subprocess.PIPE )
        #stdout = process.communicate()[0]
        
        nxt=0
        while True:
            print("looping")
            output = process.stdout.readline()
            if nxt>1:     
                process = subprocess.Popen(['omxplayer', songs[nxt],'-o','local'], stdout=subprocess.PIPE)
                output = process.stdout.readline()
                #stdout = process.communicate()[0]
                
            if output =='' :
                print("2")
            if output:
                print("finshed")
                nxt=nxt+1
            if GPIO.input(7)==0:
                break

问题是在这个循环之后和之外的代码在子进程完成之前不起作用。如何使用 ayncio 以便获取一些 gpio 读数并在需要时退出此循环?我真的花了 8 个小时来弄清楚这个谷歌搜索。但是所有可用的教程都很难理解。

4

1 回答 1

0

如果您正在与实时进程交互,则需要有一些句柄来执行此操作 - 通常这看起来像一个socket,这似乎是进程对这些示例的期望(简要略读)

但是,为了让您的 Python 进程在管理它时也执行一些逻辑,您需要以下之一

  • 线程:可能更容易推理,但有更麻烦的警告(有限的最大交互、清理、序列化命令..)
  • asyncio:可能是总体上最好的选择,但一开始可能更麻烦
  • 多处理:类似于线程,但可能是最麻烦的推理(即进程如何通信?)并且对您的情况最不利(简单地写入或读取套接字)

这超出了问题的范围,但要开始,您可能会发现很容易

  • 编写一个与套接字交互的小测试脚本以了解它们是如何工作的
  • 使用一个好的但简单的异步 Web 框架(如Tornado)来了解异步逻辑的行为方式
  • 将它们与 Tornado 的 IOStream 逻辑结合使用来制作一个完整的示例
  • 继续您的新设计理念
于 2021-06-11T07:14:31.487 回答