第二个python执行失败

时间:2013-03-13 13:42:00

标签: python python-3.x python-embedding

我在为需要在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 个答案:

答案 0 :(得分:2)

嗯,这很快。

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

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

相关问题