C DLL 中初始化 Python 虚拟机问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justou
V2EX    C++

C DLL 中初始化 Python 虚拟机问题

  •  
  •   justou 2022-11-17 21:25:38 +08:00 1467 次点击
    这是一个创建于 1061 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一个 C 中调用 Python 函数的问题。A.dll 中导出了int start_python()(调用了Py_Initialize) 和void stop_python()(调用了Py_Finalize)。B.dll 导出了一些 C 函数,这些 C 函数中调用了一些 python 函数, 这些 Python 函数是通过 cython 的 cdef public 声明再由 cytho 生成的(Embedding Cython modules in C/C++ applications),目的是通过 dll 将 Python 环境隐藏。应用 a.exe 通过 loadlibrary 的方式加载了 A.dll 和 B.dll (它们都依赖于 python3.dll ):

    1. 调用 A.dll 的start_python启动 python 解释器, 然后调用 B.dll 中导出的 C 函数, 产生 access violation ;
    2. 调用 A.dll 的start_python启动 python 解释器, 尝试在 B.dll 中也调用Py_Initialize启动 python 解释器,都启动成功, 调用 B.dll 中导出的 C 函数, 产生 access violation ;
    3. 仅在 B.dll 中通过Py_Initialize启动 python 解释器,调用 B.dll 中导出的 C 函数, Ok.

    经过 debug 发现 access violation 的出现是 cython 生成的代码里某个函数指针为 NULL,然后调用了它,看上去像是 Python 虚拟机没有得到正确的初始化,导致那个函数指针也没有初始化。请问 1 、2 问题出在哪儿?

    手头暂时没有 Windows 机器,之后我再简化一个可测试的 demo 。

    justou
        1
    justou  
    OP
       2022-11-18 10:52:23 +08:00
    做了个简易 demo, 所有依赖都在里面, CLion 可以直接打开工程. 其它开发环境可能要用里面的 CMakeLists.txt 生成工程文件 https://drive.google.com/file/d/1OElQ6j8LwA-A2A45G2OROepqywmvh3Hn/view?usp=sharing
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2916 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 14:32 PVG 22:32 LAX 07:32 JFK 10:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86