第二次python执行失败

Posted

技术标签:

【中文标题】第二次python执行失败【英文标题】:second python execution fails 【发布时间】:2013-03-01 11:44:46 【问题描述】:

我在为需要在 python 中运行自定义脚本的应用程序嵌入 python 3 引擎时遇到问题。由于脚本可能完全不同,有时是用户提供的,因此我试图将每个执行隔离,并且不需要在不同脚本的执行之间保留任何数据。

所以,我的解决方案是将每次执行包装在 Py_InitializePy_Finalize 之间。它看起来像这样:

void ExecuteScript(const char* script)

Py_Initialize();

PyRun_SimpleString( script );

Py_Finalize();

但是,对于特定的 python 脚本,这在第二次执行脚本时会失败:

done!
Traceback (most recent call last):
  File "<string>", line 8, in <module>
  File "\Python33Test\Output\Debug\Python33\Lib\copy.py", line 89, in copy
    rv = reductor(2)
TypeError: attribute of type 'NoneType' is not callable

python 脚本如下所示:

class Data:
    value1 = 'hello'
    value2 = 0

import copy

d = Data()
dd = copy.copy( d )
print ( 'done!' )

如您所见,脚本第一次执行时“完成!”被打印出来了。但是第二次它在复制函数内部引发了一个异常。

看起来python引擎在第一次初始化-完成后处于某种奇怪的状态。注意,这是python 3。

另外,值得注意的是 Python 2.7 没有这个问题。

我想可能还有其他示例可以更好地揭示正在发生的事情,但我还没有时间找到。

测试项目的完整来源可以在这里找到: https://docs.google.com/file/d/0B86-G0mwwxZvNGpoM1Jia3E2Wmc/edit?usp=sharing

请注意,该文件为 8MB,因为它包含 python 发行版。

感谢任何有关如何解决此问题的想法。

编辑:我还放了一份包含标志的项目副本,用于在 Python 3 和 Python 2.7 之间切换(文件为 31 MB):https://docs.google.com/file/d/0B86-G0mwwxZvbWRldTd5b2NNMWM/edit?usp=sharing

编辑:嗯,我用 Python3.2 测试过,效果很好。所以它似乎只是 Python3.3 中的错误。添加为问题:http://bugs.python.org/issue17408#

【问题讨论】:

【参考方案1】:

嗯,这很快。

他们实际上发现问题出在 Python 3.3 代码中。

http://bugs.python.org/issue17408#

【讨论】:

以上是关于第二次python执行失败的主要内容,如果未能解决你的问题,请参考以下文章

如果第二次测试失败,cypress 将停止执行,但我需要继续运行其他测试?在赛普拉斯

每次 TortoiseSVN(通过 *** 连接时)第一次失败,但第二次工作

Python:只执行一次for循环(不是第一次而是第二次)? [复制]

第二次通话失败

模拟第一次调用失败,第二次调用成功

RxBluetoothkit 调用retrievePeripherals 第二次失败