答案请参见:
\n首先,我知道很多问题都与这个问题类似。\n但是在花了这么多时间之后,我现在向社区寻求帮助。
\n我开发并使用了一堆依赖于 的 python 模块tqdm。\n我希望它们可以在 Jupyter、控制台或 GUI 中使用。\n在 Jupyter 或控制台中一切正常:日志记录/打印和 tqdm 进度之间没有冲突酒吧。以下是显示控制台/Jupyter 行为的示例代码:
# coding=utf-8\nfrom tqdm.auto import tqdm\nimport time\nimport logging\nimport sys\nimport datetime\n__is_setup_done = False\n\n\ndef setup_logging(log_prefix):\n global __is_setup_done\n\n if __is_setup_done:\n pass\n else:\n __log_file_name = "{}-{}_log_file.txt".format(log_prefix,\n datetime.datetime.utcnow().isoformat().replace(":", "-"))\n\n __log_format = \'%(asctime)s - %(name)-30s - %(levelname)s - %(message)s\'\n __console_date_format = \'%Y-%m-%d %H:%M:%S\'\n __file_date_format = \'%Y-%m-%d %H-%M-%S\'\n\n root …Run Code Online (Sandbox Code Playgroud) 我有一个一直在使用的Py3.x GUI应用程序Gooey。该应用程序功能齐全,并且GUI可以按预期工作,但内置控制台/终端接收缓冲的输出除外。
如果我使用来运行.py文件,这不是问题pythonw -u script.py,但是我现在尝试将工具捆绑/冻结到中.app。捆绑过程一直有效,但是在打开应用程序时仍然存在缓冲输出的问题。
到目前为止,我发现了以下内容,但没有尝试过:
一些线程建议在每次调用时使用flush=Truewith print()进行写操作,但是logging-我在这里感兴趣的是-没有这样的互补标志。因此,该线程中的各种猴子修补解决方案对我也没有用(需要注意的是,我对logging井的内部结构并不了解,因此也许对记录器Gooey本身也可以应用类似的方法,并且打包过程输出的日志记录信息比我自己的调用要多得多,并且仍在缓冲中,因此看来“全局取消缓冲”才是真正需要的。
该线程提供了许多方法。确实,建议sys.stdout使用0缓冲区大小的重新打开方法,但是在第一个线程中,根据PIP 3116以及在我看来,使用PIP 3116,它是否仍然可以在Python 3上使用还存在争议。
nonbuffered_stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
sys.stdout = nonbuffered_stdout
Run Code Online (Sandbox Code Playgroud)
似乎.app完全打破了。
尝试将“ a” -u或PYTHONUNBUFFERED=1“ shebang ”“注入” ,无论是否带有,都似乎不起作用(在本例中为MacOS)-S。
python3 -u?我仍在尝试将MWE gooey组合在一起,但是结合使用打包过程会使这变得有些困难。
我想使用PySide创建一个简单的应用程序,只是为了从python日志记录输出.
def mpm_print():
print 'OK'
def mpm_log():
log.info('OK')
class LabWindow(QtGui.QMainWindow):
def __init__(self):
super(LabWindow, self).__init__()
self.initUI()
mpm_print()
mpm_log()
def initUI(self):
font = QtGui.QFont()
font.setFamily("Courier")
font.setFixedPitch(True)
font.setPointSize(10)
self.qtxt = QtGui.QTextEdit(self)
self.qtxt.resize(self.size())
self.qtxt.setReadOnly(True)
self.qtxt.setFont(font)
self.resize(640, 512)
self.setWindowTitle('Efficient Algorithms Lab')
self.show()
Run Code Online (Sandbox Code Playgroud)
我想知道:
谢谢
我有一个非常短的PyQt程序(这是一个PythonFiddle链接 - 这似乎在Firefox中崩溃,所以代码也发布在下面),它打印输出到QTextEdit(使用来自这个SO答案的代码).当我运行代码(在Windows上)时,它会导致APPCRASH.一些观察:
time.sleep调用(即取消注释第53行),则程序完成正常time.sleep呼叫是否被注释掉,它都能正常工作我认为这意味着重定向的代码stdout以某种方式被破坏了 - 但是我很难理解它导致这种行为的错误 - 任何指针都感激不尽!
完整的错误消息
问题签名:
问题事件名称:APPCRASH
应用程序名称:pythonw.exe
应用程序版本:0.0.0.0
应用程序时间戳:5193f3be
故障模块名称:QtGui4.dll
故障模块版本:4.8.5.0
故障模块时间戳:52133a81
异常代码:c00000fd
异常偏移: 00000000005cbdb7
OS版本:6.1.7601.2.1.0.256.48
区域设置ID:2057
附加信息1:5c9c
附加信息2:5c9c27bb85eb40149b414993f172d16f
附加信息3:bc7e
附加信息4:bc7e721eaea1ec56417325adaec101aa
Pythonfiddle在Firefox上崩溃(至少对我而言),所以下面的代码也是如此:
import os, sys, time, calendar, math
from PyQt4 import QtCore, QtGui
class EmittingStream(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text): self.textWritten.emit(str(text))
class myWrapper(QtGui.QMainWindow):
def __init__(self):
super(myWrapper, self).__init__()
self.toolbar = self.addToolBar("MainMenu")
self.toolbar.addAction(QtGui.QAction("myProg", self, triggered=self.myProgActions))
def myProgActions(self): self.setCentralWidget(myWidget())
class myWidget(QtGui.QWidget):
def __init__(self): …Run Code Online (Sandbox Code Playgroud) 所以我在GUI的主窗口中有一个QTextEdit.我希望通过从远程更新列表中提取来更新此文本.我不知道如何无限地检查这个列表,没有a)做无限循环或b)线程.
a)崩溃GUI,因为它是无限循环b)产生错误说:
QObject: Cannot create children for a parent that is in a different thread.
Run Code Online (Sandbox Code Playgroud)
我明白了
我该怎么做才能解决这个问题?