Windows Python 程序重启(另类生活的罪过)

Posted

技术标签:

【中文标题】Windows Python 程序重启(另类生活的罪过)【英文标题】:Windows Python Program Restarts (Sins in a different life) 【发布时间】:2013-01-07 03:42:18 【问题描述】:

我有一个非常奇怪的 Python 错误,甚至可能是解释器中的错误。 我的最小重现代码如下所示:

from sys import stdout
print "Starting"
stdout.flush()

from camera import py_SaperaCamera
print "Imported"
stdout.flush()

cam = py_SaperaCamera.Camera()
print "Constructed"
stdout.flush()

del cam
print "Destructed"
stdout.flush()

我能想到大约 1e6 个原因,这个程序的执行可能不会那么顺利。事实上,我可以通过算法生成那么多!下面提供了一些供您娱乐,但请随意跳到妙语:

    在导入我的自定义 Cython 模块 py_SaperaCamera 期间 由于初始化或删除控制我的设备的对象 Segfaults、内存错误、因调皮被操作系统杀死 闪电,停电,第二次来临。随便!

如果执行以某种方式停止,我会非常喜欢它,也许是一个段错误,来自 boost::whatever 的一个充满爱的消息,无论要求我联系应用程序支持团队,地狱,即使它只是停止并且什么也没打印。这将是一流的。

没有。相反,我得到以下输出:

Starting
Imported
Constructed
Starting
Imported
Constructed
Starting
Imported
Constructed
Starting
Imported
Constructed
Starting
Imported
Constructed
Starting
Imported
Constructed

细心的读者会注意到,该程序似乎已经运行了 6 次,这是野兽的明显标记。所以我的问题很简单,我上辈子做了什么才值得发生这样的事情?

【问题讨论】:

另外值得注意的是,“Destructed”似乎永远不会被打印出来。这是正确的吗? 确实如此。在实际的应用程序中,我会收到更多的日志消息,但实际上无论那里发生什么,我都不希望看到它重新开始。 你是怎么运行这个的?如果您只是在 cmd 窗口中执行py.exe myscript.py,您应该能够看到任何可疑的情况。如果你以其他方式运行它……好吧,也许你做错了什么,但如果你不告诉我们你在做什么,我们就无法诊断它。 另外,如果你只运行这个精简的程序,它是否表现出相同的行为? (我问的部分原因是我最近在自己的代码中遇到了一个非常愚蠢的错误,我在if __name__ == '__main__': main() inside main() 中做了可预测的后果......) 好的,这再次证实了我的猜测。您正在从 C 代码中践踏堆栈或解释器的堆结构。 (它可能来自numpy 代码,如果您以某种方式让numpy 相信堆栈的一部分是应该用作数组的缓冲区,但这似乎不太可能。 ) 事实上,这会导致跳回到脚本的开头,而不是段错误或让你的计算机复活并吃掉你的猫或其他任何可能只是一些不寻常但并非不可能的愚蠢运气,并且没有真正意义。 【参考方案1】:

为什么不注释掉cam = py_SaperaCamera.Camera()?然后你就会知道是不是你的 Camera 类的实例化了。这可能会缩小您搜索问题的范围。

【讨论】:

以上是关于Windows Python 程序重启(另类生活的罪过)的主要内容,如果未能解决你的问题,请参考以下文章

pyinstaller打包Windows的exe文件后,多进程导致程序反复重启,python

另类阻止驱动加载

另类的开发环境搭建

Windows XP/Windows 7/Windows 8/Windows 10系统封装的另类教程和思路

Python装饰器的另类用法

python中lambda的另类使用