我在为需要在 python 中运行自定义脚本的应用程序嵌入 python 3 引擎时遇到问题。由于脚本可能完全不同,有时是用户提供的,我试图使每个执行隔离,并且不需要在不同脚本的执行之间保留任何数据。
所以,我的解决方案是将每次执行包装在Py_Initialize
和之间Py_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=分享
编辑:嗯,我用 Python3.2 测试过,效果很好。所以它似乎只是 Python3.3 中的错误。添加为问题:http ://bugs.python.org/issue17408#