Python3源码编译和使用静态链接库lib&动态链接库dll详细介绍

说明:

本文主要介绍:

1.python3源码的下载和编译内核工程(pythoncore)

2.编译的lib和dll使用例子。

若需要编译源码PCBuild下其他python工程,类似参考内核工程(pythoncore)编译的方式进行配置即可。

一.python源码下载

1.进入python官方网站:Python Source Releases | Python.org

2.选择想要下载的源码版本,这里我们选择3.9.10版本,点击:Download Gzipped source tarball,进行源码压缩文件下载。

3.对下载后的文件:Python-3.9.10.tgz,进行解压缩,得到的源码目录如下:

二.本地系统环境说明

笔者的环境如下:

操作系统:Win11 64位

VS版本:Visual Studio 2022

注意:源码的PC编译解决方案(pcbuild.sln)放在源码目录的PCBuild文件下,编译的一些说明信息,详见文件夹下的readme.txt,注意VS的版本要求,这里要求时2017以上的VS版本,笔者用的是VS2022:

三.内核工程(pythoncore)的静态链接库lib编译和使用

1.编译步骤:

1.打开PCbuild路径下的pcbuild.sln解决方案文件,若版本比2017高,打开时会自动进行解决方案升级,按照提示进行升级即可,对编译没有影响。

2.参考PcBuilid目录下的readme.txt,对内核工程pythoncore进行编译配置(注意,readme.txt说明的是Release版的编译,笔者此处的例子是Debug版本编译):

1).右键pythoncore工程->属性->选择Debug/x64。(这里以Debug版本的64位操作系统作为例子配置, 读者也可以自由选择Release/Win32,根据自己需要配置即可)

2).设置配置属性,将动态DLL配置为静态库(.lib)

3).修改预编译宏,将Py_ENABLE_SHARED修改为Py_NO_ENABLE_SHARED:

4).修改运行库,将:多线程调试DLL(/MDd),修改为:多线程调试(/MTd)。(注意: 若配置Release编译,则这里需要修改运行库选项为:多线程(/MT)):

 3.右键pythoncore编译生成lib文件,由于是debug编译,因此生成的文件名为:python39_d.lib。若为Release,则文件名为:python39.lib

2.使用步骤

1.创建一个win32空项目,命名为test

2.将PCBuild文件夹下的include目录、PC目录、Lib目录,复制到test项目目录下:

3.配置项目属性(Debug/x64)(注意:需要与编译的lib属性配置一致,否则会链接异常)

1).添加刚刚复制的IncludePC目录为头文件包含目录

2).设置运行时属性,与python39_d.lib的运行时属性一致,这里为:多线程调试(/MTd)

3).添加预编译宏:Py_NO_ENABLE_SHARED

4).将编译的lib文件,放到test工程目录下,并添加四个依赖库文件:python39_d.lib,Version.lib,Ws2_32.lib,Pathcch.lib

4.添加main代码文件,代码如下:

//main.cpp

#include "Python.h"

int main(int argc, char* argv[])
{
	Py_Initialize();
	if (!Py_IsInitialized())
		return 0;
	PyRun_SimpleString("print('hello world!')");
	Py_Finalize();
	return 1;
}

5.编译运行: 

3.常见错误

1.编译的lib的编译配置,与运行程序test使用的编译配置不一致,如:lib编译使用的是Debug/x64,而运行程序使用的是Release/Win32等,会导致链接异常。需要检查保持编译配置一致

2.运行程序未添加windows库lib文件,导致某些接口链接找到不实现从而链接异常(解决方法为添加对应的库(例如Version.lib,Ws2_32.lib,Pathcch.lib),具体baidu即可),报错如:

3.运行程序test,未添加宏定义:Py_NO_ENABLE_SHARED,或lib编译时未修改Py_ENABLE_SHARED为Py_NO_ENABLE_SHARED,会导致链接异常,具体错误信息如:

4.遗漏将Lib,Include,PC等目录放到工程上,或者配置相关路径错误,都会导致test项目编译异常。5.若本地安装了其他python版本,并且设置了python系统环境变量,可能会导致test工程运行时异常,可以在Py_Initialize函数执行之前强制设置当前编译源码的Lib所在的路径(此处为放到了test目录下),如:

四.内核工程(pythoncore)的动态链接库dll编译和使用

1.编译

1.打开PCbuild路径下的pcbuild.sln解决方案文件,若版本比2017高,打开时会自动进行解决方案升级,按照提示进行升级即可,对编译没有影响(截图参考编译lib)。

2.选择编译配置:Debug/x64

3.右键pythoncore工程进行编译,编译成功产生dll文件(python39_d.dll)和导入lib文件(python39_d.lib)。(注意:这里的导入lib文件与上面静态编译的lib文件是不一样的文件)

2.使用

1.创建一个win32空项目,命名为test2

2.将python源代码目录文件夹下的include目录、PC目录、Lib目录、编译的dll文件(python39_d.dll),导入lib文件(python39_d.lib),都放到test2工程目录下:

3.配置项目属性(Debug/x64),注意:(Debug/x64)需要与编译的dll编译属性配置一致,否则会链接异常

1).将python源代码目录下的IncludePC目录为头文件包含目录

2).设置运行时属性,与python39_d.dll的运行时属性一致,这里为:多线程调试DLL(/MDd)

3).添加依赖库文件:python39_d.lib

4.添加main代码文件,代码如下:

//main.cpp
#include "Python.h"

int main(int argc, char* argv[])
{
	Py_Initialize();
	if (!Py_IsInitialized())
		return 0;
	PyRun_SimpleString("print('hello world2!')");
	Py_Finalize();
	return 1;
}

5.编译运行 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python创建动态链接库DLL),你可以使用`ctypes`库。下面是一个简单的示例: 1. 首先,创建一个Python脚本(例如,`example.py`),并在其中编写你的函数或代码逻辑。 ```python # example.py def add_numbers(a, b): return a + b ``` 2. 使用`cython`库将Python代码转换为C代码。你可以使用以下命令安装`cython`: ``` pip install cython ``` 然后,创建一个名为`example.pyx`的文件,其中包含以下内容: ```python # example.pyx def add_numbers(a, b): return a + b ``` 3. 创建一个名为`setup.py`的文件,用于构建和编译动态链接库。在其中添加以下代码: ```python # setup.py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("example.pyx")) ``` 4. 打开命令提示符或终端,并导航到包含上述文件的目录。然后运行以下命令来构建和编译动态链接库: ``` python setup.py build_ext --inplace ``` 这将生成一个名为`example.so`(Linux / macOS)或`example.dll`(Windows)的动态链接库文件。 5. 现在你可以在其他Python脚本中使用这个动态链接库。例如,创建一个名为`main.py`的文件,并添加以下代码: ```python # main.py from ctypes import CDLL # 加载动态链接库 example = CDLL('./example.so') # 替换为example.dll(Windows) # 调用动态链接库中的函数 result = example.add_numbers(2, 3) print(result) ``` 运行`main.py`脚本,将会输出结果 `5`。 这就是使用Python创建动态链接库的基本步骤。你可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值