该如何解决 PyMarshal_ReadObjectFromFile 造成 segmentation fault

2019-02-18 20:49:26 +08:00
 leoleoasd

如题 我的 c++代码:

#include <Python.h>
#include <iostream>
#include <marshal.h>
using namespace std;
int main(){
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
    //cout<<233<<endl;
    Py_Initialize();
    FILE *fff = fopen("./a.pyc","br");
    pModule = PyMarshal_ReadObjectFromFile(fff);
    //Py_DECREF(pModule);
    //cout<<PyCode_GetNumFree(pModule);
    //PyImport_ExecCodeModule("asd",pModule);
    pValue = PyLong_FromLong(123);
    cout<<PyCode_Check(pModule);
    
    return 0;
}

只要运行了 PyCode_Check(pModule) 就会导致段错误 进一步测试发现 只要调用 pModule->ob_type 就会导致段错误 同时 a.pyc 文件在 python 中使用 marshal.load 读取 运行 是完全正常的

环境: macos 10.13 测试过 homebrew 的 python 以及 miniconda 的 python 均有这个问题

该如何解决?

1019 次点击
所在节点    Python
1 条回复
leoleoasd
2019-03-01 23:12:32 +08:00
docker 内运行就能解决这个问题

同时还有个坑: 网上都说 pyc 文件前 8 字节是文件头要去掉 但是 python3.7 中是 16 字节

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX