立即将 stdout 重定向到 tkinter(无需等待进程完成)

2023-12-03

我正在编写一个 python 应用程序来获取用户的一些输入并根据这些输入调用 shell 脚本。

这个 shell 脚本可以运行相当长的一段时间,我想将它生成的输出(实时)重定向到 tkinter。 我设法做到了这一点,但它仅在 shell 脚本完全完成后发生,而不是在 shell 脚本“回显”某些内容后立即发生。

所以主要问题: 1. 仅在退出 shellScript.sh 后,输出才会出现在文本小部件中(尽管如果我在终端中手动运行相同的内容,我会看到连续的输出)。 2.附带问题:输出中打印的所有“\n”都只是打印为“\n”,并且文本小部件中没有添加新行。

这是我所拥有的:

class RedirectText(object):
   def __init__(self, text_ctrl):
       """Constructor"""
       self.output = text_ctrl

   def write(self, string):
       self.output.insert(tk.END, string[2:])

class Gui(GuiApp):
   def __init__(self, master=None):
      redir = RedirectText(self.text_Output)
      sys.stdout = redir

  def testRun(self, event=None):
     p = subprocess.Popen(["./shellScript.sh"], stdout=subprocess.PIPE)
     print(p.communicate()[0])

As p.communicate()将等待该过程完成,因此使用p.poll() and p.stdout.readline()反而。同样将进程放在一个线程中以避免阻塞主线程:

import threading
...
class Gui(GuiApp):
    ...
    def runScript(self):
        print('started')
        p = subprocess.Popen(['./shellScript.sh'], stdout=subprocess.PIPE, bufsize=1, text=True)
        while p.poll() is None: # check whether process is still running
            msg = p.stdout.readline().strip() # read a line from the process output
            if msg:
                print(msg)
        print('finished')

    def testRun(self, event=None):
        # create a thread to run the script
        threading.Thread(target=self.runScript, daemon=True).start()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

立即将 stdout 重定向到 tkinter(无需等待进程完成) 的相关文章

  • 什么时候在Python中使用弱引用?

    谁能解释一下弱引用的用法吗 The 文档 http docs python org library weakref html没有具体解释 只是说GC可以随时销毁通过弱引用链接到的对象 那么拥有一个随时可能消失的物体还有什么意义呢 如果我需要
  • 如何在Python中对两个字符串进行按位异或?

    我想在 python 中执行两个字符串的按位异或 但 python 中不允许字符串的异或 我该怎么做 您可以将字符转换为整数并对它们进行异或 l ord a ord b for a b in zip s1 s2 这是一个更新的函数 以防您需
  • 使用 selenium 和 python 在网页网格中抓取 javascript 数据

    我的问题是我需要包含网站子域的网格中的所有数据https applipedia paloaltonetworks com https applipedia paloaltonetworks com 包含名称 类别 子类别 风险 技术的数据
  • 使用 setuptools (pip) 时如何打印警告和错误

    我正在使用 setuptools 来打包代码 以便可以使用以下命令轻松安装它 cd project name pip install 在设置过程中 我想警告用户有关预先存在的配置文件的信息 并在系统上打印一些安装后说明 例如 etc pro
  • python 函数 *args 和 **kwargs 以及其他指定的关键字参数

    我有一个 Python 类 它的方法应该以这种方式接受参数和关键字参数 class plot def init self x y self x x self y y def set axis self args xlabel x ylabe
  • 如果每个元组中的第二项重复,如何从元组列表中删除元素?

    如果每个元组中的第二项重复 如何从元组列表中删除元素 例如 我有一个按第一个元素排序的列表 如下所示 alist 0 7897897 this is a foo bar sentence 0 653234 this is a foo bar
  • 映射 2 个数据帧并替换目标数据帧中匹配值的标头

    我有一个数据框 df1 SAP Name SAP Class SAP Sec Avi 5 C Rison 6 A Slesh 7 B San 8 C Sud 7 B df2 Name Fi Class Avi 5 Rison 6 Slesh
  • 如何为 PyYAML 编写代表程序?

    我想要一个自定义函数来序列化任意 python 对象 就像 json dump 函数有一个名为 default 的可选参数 如果对象不是 json 可序列化的 它应该是 json 转储器将调用的函数 我只是想从 json 包中执行相当于此操
  • python osmnx - 仅提取一个国家的大型高速公路

    我知道可以通过 OSMNX python 包提取城市的道路网络 详情请参阅https geoffboeing com 2016 11 osmnx python street networks https geoffboeing com 20
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • 在Python中将月份和年份的列合并为季度和年份的列

    我有一个数据框 df Month 1 8 Year 2015 2020 df pd DataFrame data df df 想要将其转变为新列 期望的输出 df Month 1 8 Year 2015 2020 Quarter Q1201
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • 使用 SQLAlchemy 查询 Pandas DataFrame 时重命名列

    当您将数据查询到 pandas 数据帧时 有没有办法保留 SqlAlchemy 属性名称 这是我的数据库的简单映射 对于 school 表 我将数据库名称 SchoolDistrict 重命名为较短的 district 我从 DBA 中删除
  • 识别文本中的多个类别和相关情感

    如果您有一个文本语料库 如何识别所有类别 来自预定义类别列表 以及与之相关的情绪 正面 负面写作 我将在 Python 中执行此操作 但现阶段我不一定要寻找特定于语言的解决方案 让我们用一个例子来看看这个问题 试图澄清我的问题 如果我有一整
  • 过滤给定范围内的坐标

    我有数百个带有地理位置的 out 文件 我将把它们批量导入到 SQLite 数据库中 但是 为了节省时间 我只会导入地理坐标在某些间隔内的线 文件是这样的 value value longitude latitude value value
  • 抓取 Shopee API v4

    我有一个最终项目 其中我想要检索的数据是通过在shopee上抓取数据来获取的 但是当我在隐藏的API上抓取shopee时遇到问题 当我在Insomnia脚本上尝试时 脚本会运行 但是当我尝试时在本地或 google colab 脚本上 这是
  • 用于监视文件夹和更新数据库的 Python 守护进程

    这专门用于管理 MP3 文件 但它应该可以轻松地适用于任何包含大量文件的目录结构 我想找到或编写一个守护程序 最好用Python 来监视一个包含许多子文件夹的文件夹 这些子文件夹都应该包含X个MP3文件 每当添加 更新或删除文件时 它都应该
  • pandas groupby 中两个系列的最大值和最小值

    是否可以从 groupby 中的两个系列中获取最小值和最大值 例如下面的情况 分组时c 我怎样才能得到最小值和最大值a and b同时 df pd DataFrame a 10 20 3 40 55 b 5 14 8 50 60 c x x
  • Maya python 连接选择的属性

    我一直在尝试制作一个简单的脚本 它将采用两个视口选择 然后基本上将第二个视口的旋转连接到第一个 我不确定如何正确地从视口选择中为对象创建变量 这是我的尝试 但不起作用 import maya cmds as cmds sel cmds ls
  • 获取 Flask 中没有端口的请求主机名

    我刚刚设法使用 Flask 获取我的应用程序服务器主机名request host and request url root 但这两个字段都返回请求主机名及其端口 我想使用仅返回请求主机名的字段 方法 而无需进行字符串替换 如果有 没有 We

随机推荐

  • 如何使用 TraMineR 和聚合序列数据进行差异分析?

    由于我有一个大数据集和有限的计算资源 我想利用聚合序列对象来差异分析使用 R 包TraMineR and WeightedCluster 但我很难找到合适的syntax因为这样做 在下面的示例代码中 您会发现两个差异分析 差异分析的第一个树
  • 如果路径包含空格,则无法从 VBScript 启动 bat 文件

    例如 我一直在尝试从路径启动 myFileToRun bat 文件 D My Folder batchfiles myFileToRun bat 下面是我尝试运行它的 VBScript Dim WshShell strCurrentDire
  • 如何获取我的设备中安装了多少个应用程序及其名称或上次访问的信息?

    我需要在我的应用程序中显示上次访问的应用程序信息 我怎样才能得到这些信息 您可以使用此代码来获取应用程序列表 PackageManager pm this getPackageManager Intent intent new Intent
  • postDelayed是否会导致消息跳到队列的前面?

    我在 Android 文档中查找 postDelayed发布延迟的文档 这与另一个问题类似 https stackoverflow com questions 25820528 is postdelayed relative to when
  • 执行用包含脚本标签的 XMLHttpRequest 编写的 Javascript?

    通过 JavaScript 请求 XMLHttpRequest使用一些额外的 Javascript 进行响应 这些额外的 Javascript 需要添加到请求页面的页面中 使用 eval 如果响应类似于 alert This is the
  • 如何在 Swift 3 中同时发出 https 请求

    我在执行 https 请求时遇到问题 如果请求没有任何错误 我永远不会收到消息 这是一个命令行工具应用程序 我有一个允许 http 请求的 plist 我总是看到完成块 typealias escHandler URLResponse Da
  • 使用 Apache Camel 重复从只读文件系统轮询文件(幂等 = false)?

    我正在使用轮询消费者模式来读取给定只读目录中的所有文件并处理它们 是否可以选择忽略幂等性 我知道用 noop true 和 idempot false 定义的路由会使整个系统崩溃 无限循环 但池消费者模式是在给定时刻触发的一次性操作 Cam
  • 如何引用vue、js pug模板中的数据?

    基本上我试图从事件名称创建永久链接 当我使用 v model 从事件名称中获取值时 它可以工作 但是如何将转换后的永久链接放回到 pug 的另一个输入框中 这有效 P message textarea rows 2 message 但是当我
  • spring/hibernate:每次打开/关闭会话 VS getCurrentSession

    这些方法之间有什么区别 哪一种更好 到目前为止 我的代码片段如下 public void delete Song song session sessionFactory getCurrentSession session delete so
  • Oracle 11g 的 NHibernate TransactionScope 问题

    以下代码片段在 SQL Server 2008 SP1 中工作正常 但在 Oracle 11g 中 对 session BeginTransaction 的调用会引发异常 并显示消息 连接已经是本地或分布式事务的一部分 堆栈跟踪如下所示 使
  • Amazon Route 53 + Heroku 应用程序无法从某些地方访问 - 该怎么办?

    我正在 Heroku 上工作 在网络方面没有太多背景 我正在开发的应用程序似乎无法从某些地方访问 我们收到了人们无法访问它的报告 我们使用的 ping 服务 Statuscake 报告该站点始终无法从某些节点位置访问 为了解决这个问题 我们
  • Netbeans 15 和 payara 6.2022

    我在 JDK 17 上运行 Netbeans 15 我想尝试 Jakarta EE 10 因此我决定将我的应用程序服务器升级到 Payara 6 2022 1 Alpha 4 应用程序服务器工作正常 我可以在更新大量库后将我的应用程序部署到
  • PHP rtrim“.php”

    我想从字符串末尾删除 php 如果存在 考虑一下 filename index rtrim filename php returns index filename search rtrim filename php returns sear
  • .Net Maui - 如何返回根页面

    我觉得我只是没有向谷歌霸主问这个问题 所以我想看看是否有人可以帮助解释如何做到这一点 我有一个新的 Net Maui 应用程序 它使用 4 个不同的视图 页面 我创建的 MainPage 根 允许我从我们的数据库中搜索用户 然后将您转换到新
  • 在 Swift 4 中用一根手指进行旋转

    我创建了一个 UIGestureRecognizer 来仅用一根手指旋转视图 视图在开始时旋转 但一旦达到一定程度 就会向另一个方向旋转 你能帮我修改我的代码吗 UI视图控制器 override func viewDidLoad super
  • 编写一个肯定会陷入死锁的程序[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我最近在采访中被问到这个问题 我回答说如果交错出错就会出现死锁 但是面试官坚持说可以写一个不管交错总是陷入死锁的程序 我们可以写这样的程序吗 你能给我指一些类似的示例程序吗 UP
  • 高效四元数到欧拉变换

    我使用以下 Python 函数将四元数转换为欧拉角 import math def quaternion to euler angle w x y z ysqr y y t0 2 0 w x y z t1 1 0 2 0 x x ysqr
  • Spring框架无法启动嵌入式容器

    我正在关注 Spring in Action 第四版第 5 章 但我一直停留在第一个示例上 这是我的 Eclipse Luna 项目结构 如果我将这个项目作为 Spring Boot App 运行 那么它会抛出异常 org springfr
  • 如何搜索XML文件中存储的字符串内容?

    我是安卓开发新手 我有一个包含一堆片段的活动 每个片段显示不同的文本 我在运行时从 strings xml 设置文本 即 tv setText 这是我的 strings xml 的示例
  • 立即将 stdout 重定向到 tkinter(无需等待进程完成)

    我正在编写一个 python 应用程序来获取用户的一些输入并根据这些输入调用 shell 脚本 这个 shell 脚本可以运行相当长的一段时间 我想将它生成的输出 实时 重定向到 tkinter 我设法做到了这一点 但它仅在 shell 脚