gpt4 book ai didi

Python threading.Timer 对象在编译为 .exe 时不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:49:00 31 4
gpt4 key购买 nike

这是对 https://stackoverflow.com/questions/37684111/ironpython-exe-file-closing-immediately-no-exception-thrown 的跟进

我发现由于线程库中的 Timer 对象存在问题,我的程序在编译后无法运行。我已将该库包含在我的\Lib\site-packages 目录中,并将该目录添加到程序中的路径中。这是我正在使用的测试代码 - 一个简单的计数程序:

import sys
from threading import Timer

sys.path.append('C:\Users\[user]\Documents\Visual Studio 2015\Projects\Testing Timer Compilation issue\Testing Timer Compilation issue')
sys.path.append('C:\Users\[user]\Documents\Visual Studio 2015\Projects\Testing Timer Compilation issue\Testing Timer Compilation issue\Lib')

class Chron():
def __init__(self):
self.t = Timer(2, self.count)
self.t.start()
self.i = 0

def count(self):
print(self.i)
self.i += 1
if self.i <= 15:
self.t = Timer(2, self.count)
self.t.start()

c = Chron()

在 Visual Studio 的交互式解释器中完美运行,但是一旦我使用 pyc.py 编译为 exe 文件,它就不会运行,并在 ~5 秒后简单地关闭,没有抛出异常。

如前一个问题所述,我有一个需要编译的程序,其中包含一个计时器,因为源代码包含敏感凭据。是否需要任何技巧才能使 Timer 在 exe 中工作?只是不兼容吗?

编辑:6 天没有答复。不幸的是,互联网上的任何地方似乎都没有针对此特定问题的任何资源。几乎就好像我是唯一遇到此问题的人一样。这对我来说似乎很奇怪,因为问题似乎出在 Timer 对象本身,而且我无法想象没有其他人尝试部署其中包含 Timer 的应用程序。在这一点上,任何见解都会有所帮助,因为我完全被难住了。

最佳答案

问题是您依赖底层的 Python 解释器来优雅地处理可执行文件的主线程已终止但应该还有一些其他线程仍在运行的情况。

直接使用 CPython 或 IronPython 运行代码会按预期工作。您创建的 Timer 对象实际上是线程的特化。解释器认识到有一些非守护进程线程仍处于事件状态,因此不会终止。参见 the docs如果您不知道这两种线程之间的区别,请参阅有关守护线程的解释。

但是,当您作为可执行文件运行时,IronPython 用来包装解释器的代码似乎不太友好。它只是等待主线程结束,然后关闭所有内容。尽管您的计时器被声明为非守护线程,但仍会发生这种情况。可以说这是 IronPython 中的一个错误。

因此,解决方案是在定时器线程仍在运行时让主线程继续运行。对于此示例代码,最简单的方法就是 sleep - 例如:

import sys
sys.path.append(r"c:\Program Files (x86)\IronPython 2.7\Lib")
from threading import Timer
from time import sleep

class Chron():
def __init__(self):
self.t = Timer(2, self.count)
self.t.start()
self.i = 0

def count(self):
print(self.i)
self.i += 1
if self.i <= 15:
self.t = Timer(2, self.count)
self.t.start()

c = Chron()
sleep(35)

但是,对于更复杂的应用程序,您应该考虑在线程之间进行一些通信以协调何时关闭 - 例如使用 join()等待线程终止。

关于Python threading.Timer 对象在编译为 .exe 时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37685928/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com