第二次Python执行失败

4 投票
1 回答
1033 浏览
提问于 2025-04-17 18:56

我在把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!' )

你可以看到,第一次执行这个脚本时,'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的标志的项目副本(文件大小为31MB):https://docs.google.com/file/d/0B86-G0mwwxZvbWRldTd5b2NNMWM/edit?usp=sharing

编辑:好吧,我用Python 3.2测试了一下,结果很好。所以这似乎只是Python 3.3的一个bug。我把它作为一个问题添加了:http://bugs.python.org/issue17408#

1 个回答

2

哇,这个进展真快。

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

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

撰写回答