Windows平台C调用Python

因为项目需要,我用Python写了脚本,计划利用C调用,原平台为VScode+MinGW+Anaconda,执行

gcc main.c -l python

报错cannot find -lpython,未解决问题,Python官方文档说是在Windows平台支持Windows C/C++扩展Python,故暂时先利用VS处理该问题。

在VS上,也先后遇到各种问题:

1. 无法打开Python36.lib或Python36_d.lib,需要在项目属性页/VC++目录/库目录添加%PYTHON_DIR%/libs,若libs文件夹下无*.lib,需要网上下载对应版本;

2.无法打开rc.exe,需将系统中的rc.exe和rcdll.dll拷贝到%VS_DIR%/VC/bin目录下;

3.无法打开kernel32.lib,将C:\Program Files(X86)\Microsoft SDKs\Windows\v7.1A\lib添加到项目属性页/VC++目录/库目录;

4.如下错误:

error LNK2001: 无法解析的外部符号 __imp_PyString_FromString
error LNK2001: 无法解析的外部符号 __imp_PyCallable_Check
error LNK2001: 无法解析的外部符号 __imp_PyObject_CallObject
error LNK2001: 无法解析的外部符号 __imp_Py_Initialize
error LNK2001: 无法解析的外部符号 __imp_Py_IsInitialized
error LNK2001: 无法解析的外部符号 __imp_PyImport_Import
error LNK2001: 无法解析的外部符号 __imp_PyModule_GetDict
error LNK2001: 无法解析的外部符号 __imp_PyDict_GetItemString
error LNK2001: 无法解析的外部符号 __imp_PyRun_SimpleStringFlags
error LNK2001: 无法解析的外部符号 __imp_Py_Finalize

fatal error LNK1120: 10 个无法解析的外部命令

保证Python版本和VS版本一致(同为x86或同为x64);

5.如下错误:

无法解析的外部符号 __imp___Py_RefTotal    
无法解析的外部符号 __imp___Py_NegativeRefcount,该符号在函数 __import_array 中被引用    

将VS项目为Release模式;

6.0x1D138947(Python36.dll)(c_py.exe中)处有未经处理的异常:0xC0000005:读取位置0x00000004时发生访问冲突,未解决。

使用MacOS和Linux做C调用Python项目,测试通过;但在利用Windows时,各种错误,仍需要想办法解决。



隔了一天重新调VSCode+MinGW+Anaconda,执行

gcc main.c -l python36

可正常编译,所生成的./a.exe在执行时中断,报错

Fatal Python error : Py_Initialize : unable to load the file system codec 

ModuleNotFoundError : No module named 'encodings'

重新配置Python环境,将path里无关的全部删掉,重新编译时报错:

C:/Program Files/mingw64/bin/.../lib/gcc/.../.../.../.../..../bin/ld.exe: cannot find -lpython36
collect2.exe: error: ld returned 1 exit status

尝试执行

gcc -W -I C:/Anaconda/include -L C:/Anaconda/libs main.c -l python36

编译成功,执行./a.exe,运行成功:

Hello, world!

需要注意的是,配置c_cpp_properties.json时,includepath中Python路径应与main.c中

#include<C:/Anaconda/include/Python.h>

一致,即:

{
    "configurations": [
        {
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Anaconda/include",
                "C:/mingW64/x86_64-w64-mingw32/include"
            ],
}

若系统存在多版本Python,环境变量设置也应与上一致,并在编译时,指定在该版本下的链接器。此外,将Anaconda环境换做Python环境时,编译仍会报错如下:

C:/Program Files/mingw64/bin/.../lib/gcc/.../.../.../.../..../bin/ld.exe: cannot find -lpython36
collect2.exe: error: ld returned 1 exit status

尚不清楚原因。

关于VS+Python,后期再想办法。



继续更新:

整个工程是嵌入式系统,只支持32位,故需要将MinGW和Anaconda均换成32位的。在MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

中下载32位版本,其中i686对应32位,x86_64对应64位,解压后放入指定路径,并将%MinGW_DIR%/bin和%MinGW_DIR%/include加入环境变量;下载并安装anaconda_x86,安装时勾选Add anaconda to my PATH environment variable,可直接配置完环境变量,更改

#include<C:/Anaconda3_x86/include/Python.h>

更改c_cpp_properties.json中对应路径。

在vscode.terminal中执行

gcc -W -I C:/Anaconda3_x86/include -L C:/Anaconda3_x86/libs main.c -l python36

需要注意的是,该命令必须连接到具体的Python版本,例如-l Python36。

整个流程走下来发现,在代码正确的前提下,编译时报错,无外乎环境变量设置问题或版本问题,针对环境变量问题,需对所有包含库、链接库路径进行检查;版本问题则需确保MinGW和Python同为32位或同为64位。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

继明照于四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值