Emscripten 交叉编译的 CPython 中出现奇怪的导入错误
Strange import error in Emscripten cross-compiled CPython
我正在将 CPython 移植到 Emscripten,并且构建成功。但是,当我尝试通过 Node.js 运行 python.asm.js 时,我在 Py_InitializeEx(0)
调用中遇到了一个非常奇怪的错误:
Traceback (most recent call last):
File "/lib/python2.7/site.py", line 62, in <module>
import os
File "/lib/python2.7/os.py", line 44, in <module>
from posix import *
TypeError: 'NotImplementedType' object does not support indexing
错误是从 Objects/abstract.c
中的 PySequence_GetItem
产生的,但我不明白执行是如何到达那里的。如果我在导致错误的行之前执行 import posix
,则 import posix
语句成功完成,我可以调用 posix 模块中的函数。因此,错误与 from <module> import *
行有关。 PySequence_GetItem
与 from <module> import *
语句有什么关系,错误的原因可能是什么?
如果你想重现问题,我released the code on GitHub
在调查问题所在时,我关闭了优化(编译并链接到 -O0
)。生成的 JS 可执行文件也失败了,但出现了不同的错误:
Invalid function pointer '495' called with signature 'iii'. Perhaps this is
an invalid value (e.g. caused by calling a virtual method on a NULL pointer)?
Or calling a function with an incorrect type, which will fail? (it is worth
building your source files with -Werror (warnings are errors), as warnings can
indicate undefined behavior which can cause this)
This pointer might make sense in another type signature:
ii: _dict_keys iiii: 0 i: undefined iiiii: 0 viii: 0 vii: 0 vi: 0 v: 0
495
495
我查看了 Emscripten 的 settings.js 以寻找与函数指针相关的选项,并找到 EMULATE_FUNCTION_POINTER_CASTS
解决了问题。
我正在将 CPython 移植到 Emscripten,并且构建成功。但是,当我尝试通过 Node.js 运行 python.asm.js 时,我在 Py_InitializeEx(0)
调用中遇到了一个非常奇怪的错误:
Traceback (most recent call last):
File "/lib/python2.7/site.py", line 62, in <module>
import os
File "/lib/python2.7/os.py", line 44, in <module>
from posix import *
TypeError: 'NotImplementedType' object does not support indexing
错误是从 Objects/abstract.c
中的 PySequence_GetItem
产生的,但我不明白执行是如何到达那里的。如果我在导致错误的行之前执行 import posix
,则 import posix
语句成功完成,我可以调用 posix 模块中的函数。因此,错误与 from <module> import *
行有关。 PySequence_GetItem
与 from <module> import *
语句有什么关系,错误的原因可能是什么?
如果你想重现问题,我released the code on GitHub
在调查问题所在时,我关闭了优化(编译并链接到 -O0
)。生成的 JS 可执行文件也失败了,但出现了不同的错误:
Invalid function pointer '495' called with signature 'iii'. Perhaps this is
an invalid value (e.g. caused by calling a virtual method on a NULL pointer)?
Or calling a function with an incorrect type, which will fail? (it is worth
building your source files with -Werror (warnings are errors), as warnings can
indicate undefined behavior which can cause this)
This pointer might make sense in another type signature:
ii: _dict_keys iiii: 0 i: undefined iiiii: 0 viii: 0 vii: 0 vi: 0 v: 0
495
495
我查看了 Emscripten 的 settings.js 以寻找与函数指针相关的选项,并找到 EMULATE_FUNCTION_POINTER_CASTS
解决了问题。