停止读取 Python 中的进程输出而不挂起?
问题:
Python 程序需要与外部交互连续产生输出的过程(例如“顶部”)。但是,直接读取输出可能会导致程序无限期挂起。
解决方案:
为了防止挂起,必须在以下情况下采用非阻塞或异步机制:读取过程输出。以下是一些可能的方法:
假脱机临时文件(推荐)
此方法利用专用文件对象来存储进程输出。
#! /usr/bin/env python<br>导入子进程<br>导入临时文件<br>导入时间<p>def main():</p><pre class="brush:php;toolbar:false"># Open a temporary file (automatically deleted on closure) f = tempfile.TemporaryFile() # Start the process and redirect stdout to the file p = subprocess.Popen(["top"], stdout=f) # Wait for a specified duration time.sleep(2) # Kill the process p.terminate() p.wait() # Rewind and read the captured output from the file f.seek(0) output = f.read() # Print the output print(output) f.close()
if 名称 == "__main__":
main()
基于线程的输出读取
这种方法采用单独的线程来连续读取进程输出,同时主线程继续执行其他任务。
导入集合<br>导入子进程<br>导入线程<br>导入时间<p>def read_output(process,append):</p><pre class="brush:php;toolbar:false">for line in iter(process.stdout.readline, ""): append(line)
def main():
# Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Create a thread for output reading q = collections.deque(maxlen=200) t = threading.Thread(target=read_output, args=(process, q.append)) t.daemon = True t.start() # Wait for the specified duration time.sleep(2) # Print the saved output print(''.join(q))
if 名称 == "__main__":
main()
signal.alarm()(仅限 Unix)
此方法使用 Unix 信号在指定超时后终止进程,无论是否已读取所有输出。
导入集合<br>导入信号<br>导入子进程<p>class Alarm(Exception):</p><pre class="brush:php;toolbar:false">pass
def Alarm_handler(signum,frame):
raise Alarm
def main():
# Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Set signal handler signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(2) try: # Read and save a specified number of lines q = collections.deque(maxlen=200) for line in iter(process.stdout.readline, ""): q.append(line) signal.alarm(0) # Cancel alarm except Alarm: process.terminate() finally: # Print the saved output print(''.join(q))
if 名称 == "__main__":
main()
threading.Timer
此方法使用计时器在指定的超时后终止进程。它适用于 Unix 和 Windows 系统。
导入集合<br>导入子进程<br>导入线程<p>def main():</p><pre class="brush:php;toolbar:false"># Start the process and redirect stdout process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) # Create a timer for process termination timer = threading.Timer(2, process.terminate) timer.start() # Read and save a specified number of lines q = collections.deque(maxlen=200) for line in iter(process.stdout.readline, ""): q.append(line) timer.cancel() # Print the saved output print(''.join(q))
if name == "__main__":
main()
没有线程,没有信号
此方法使用简单的基于时间的循环,用于检查进程输出,如果超过指定超时则将其终止。
导入集合<br>导入子进程<br>导入系统<br>导入时间 <p>def main():</p><pre class="brush:php;toolbar:false">args = sys.argv[1:] if not args: args = ['top'] # Start the process and redirect stdout process = subprocess.Popen(args, stdout=subprocess.PIPE, close_fds=True) # Save a specified number of lines q = collections.deque(maxlen=200) # Set a timeout duration timeout = 2 now = start = time.time() while (now - start) <p>if <strong>名称</strong> == "__main__":</p><pre class="brush:php;toolbar:false">main()
注意:存储的行数可以根据需要通过设置deque数据结构的'maxlen'参数来调整。
以上是如何避免 Python 程序在读取进程输出时挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

Python3.6环境下加载Pickle文件报错:ModuleNotFoundError:Nomodulenamed...

如何解决jieba分词在景区评论分析中的问题?当我们在进行景区评论分析时,往往会使用jieba分词工具来处理文�...

如何使用正则表达式匹配到第一个闭合标签就停止?在处理HTML或其他标记语言时,常常需要使用正则表达式来�...

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

记事本++7.3.1
好用且免费的代码编辑器