问题内容
我正在开发一个传感器读取程序,其中该程序的一部分涉及当金属目标进一步或靠近传感器时打印出传感器状态的实时更新。 “main_gui.py”文件将首先运行,一旦用户单击“开始数据检索”按钮,它将启动子进程“ies2v2.py”,在其中执行传感器读取过程并打印出来。
下面的代码显示了最初在控制台中打印的代码如何被打印到 gui 中。
def start_data_retrieval(self):
# start a new thread for data retrieval
threading.thread(target=self.retrieve_data_thread).start()
def retrieve_data_thread(self):
selected_current = loadcurrent[currentgrp.get()]
selected_output = outputtype[outputgrp.get()]
print(f"selected current: {selected_current}, selected output: {selected_output}")
with subprocess.popen(["python", "ies2v2.py", "--port", self._port, "--current", selected_current.name, "--output", selected_output.name], stdout=subprocess.pipe, stderr=subprocess.stdout) as process:
for line in process.stdout:
line = line.decode() # defaulting to system encoding
text_box.insert(end, line)
text_box.update()
text_box.see(end)
process.poll()
登录后复制
运行exe时,我在将语句打印到gui上时遇到延迟,一旦单击“开始数据检索”按钮,打印数据将匆忙地以大块数据的形式打印出来,并且在之前有很长的延迟再次打印。我希望它能像 pycharm 一样顺利运行...
注意:我在创建 exe 时也遇到了问题,出现这样的错误。我通过将找不到的文件复制到路径中来修复它,并且 exe 从我这边运行正常。仅供参考,以防这可能是延迟的原因......但我认为不应该如此。
编辑:ies2v2.py代码(其中一些)下面是读取传感器输出并不断更新的部分。
print('n---- Reading Data ----')
print("Live update of sensor data PROCESS_ADDR will begin. Press the 'Enter' key to stop the updates.")
time.sleep(5)
prev_process_addr = ies2.get_value(122)
while True:
print(f'Update of PROCESS_ADDR : {ies2.get_value(122)}') # SU
new_process_addr = ies2.get_value(122)
if new_process_addr != prev_process_addr:
print(f"PROCESS_ADDR value changed! {prev_process_addr} to {new_process_addr}")
prev_process_addr = new_process_addr
if keyboard.is_pressed('enter'):
print("nKey pressed! Stopping the sensor updates.")
break
登录后复制
正确答案
正如我们在评论中发现的那样,子进程没有刷新其标准输出缓冲区,这就是导致延迟的原因。刷新标准输出的一种方法是在调用 print
函数时添加 flush=True
。
以上就是如何解决通过 EXE 运行程序时的延迟和滞后问题?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!