python程序捕获subprocess.Popen运行cmd命令的实时输出

Python学习记录,如果帮到你,评论里鼓励一下(手动滑稽),谢谢。

python程序捕获subprocess.Popen运行cmd命令的实时输出

  • 概述
    • 疑问
    • 展望

概述

  • 我使用python调用pyqt写了一个界面,然后使用信号机制,将所有的输出都捕获到界面上显示,但是我的需求是需要运行一个c语言编译的exe程序,且 这个exe程序理论上是可以一直运行,除非我强制关闭,我通过subprocess.Popen运行了cmd命令,但是无论使用了什么方法都无法捕获该cmd命令的输出,还会造成pyqt界面的卡顿
    经过思考我认为,subprocess.Popen是创建了一个进程或者线程去执行cmd命令,然后我程序的主进程没收到那个线程执行结束后的唤醒导致界面一直等待卡死。然后我就开了个线程去执行该cmd命令,果然捕获了输出,至此初步满足我想要的效果。

python程序捕获subprocess.Popen运行cmd命令的实时输出_第1张图片

疑问

  • 我虽然初步得到了结果,但是我觉得还不够完善。 我主要有以下几点疑问:
    1、subprocess.Popen执行cmd命令后,即该条代码执行后,程序就会输出结果,比如我subprocess.Popen(“ping
    www.baidu.com”),而我想要实现的是创建一个全局的list,然后创建两个子线程,一个线程执行subprocess.Popen(cmd),然后实时读取到返回的每一行,就像下图执行ping命令,实时读取输出的信息,然后追加到list,然后另一个子线程就取读取list,然后可以有后续的在界面上输出或者统计画图显示出来,但是由于subprocess.Popen(cmd)语句执行后,就感觉独占了IO输出流,另一个线程感觉没效果(这里感觉有点啰嗦,可能没叙述好明白,总之就是两个子线程,一个生产者,一个消费者,生产者线程执行subprocess.Popen(cmd)往全局list写入cmd命令运行产生的每一行输出,消费者线程就去取出list的内容,结果就是消费者线程没有什么用,生产者线程运行subprocess.Popen(cmd),python的控制台就输出数据,而不是消费者线程拿出的list输出

python程序捕获subprocess.Popen运行cmd命令的实时输出_第2张图片

  • 2、pycham里面执行一个程序的时候,例如cs.py,实际上是在运行python.exe cs
    .py,这和在window’s自带的终端运行是一样的,python是怎么做到将运行的输出内容呢实时捕获到软件的控制台输出的,如果知道这个,这应该是最好的解决方案。

在这里插入图片描述
python程序捕获subprocess.Popen运行cmd命令的实时输出_第3张图片

  • 3.除了subprocess.Popen 和os的模块,还有无其他的解决方案来执行cmd命令并实时捕获输出?python有无直接与windos直接相关的api之内的。

展望

  • 最近我有点繁忙,没有好多时间来一直处理这个问题,通过以此方式记录问题,如果描述有不准确或者错误的地方,请各位朋友多多指教,我会及时改正。
    我有c语言、java、数据结构、操作系统的一些基础,python算是小白会一些简单的,希望擅长python和对此问题有理解的朋友们给点建议或者给一点思路解决一下,谢谢大家

你可能感兴趣的:(python程序捕获subprocess.Popen运行cmd命令的实时输出)