python distutils打包C/C++模块,执行python setup.py build_ext --inplace时报错cl

article/2025/9/23 13:52:08

一、问题发生环境

python可以把C/C++代码编译并打包为pyd模块,从而可以使python脚本直接调用C/C++模块功能。

我在执行python setup.py build_ext --inplace时遇到了缺失cl.exe的错误提示,然后用pip安装了cl。

再次编译,提示cl: error: no such option: -I,改变cl版本仍然不行,百思不得其解。

二、解决办法

后来意识到C/C++模块的编译实际上还是python调用专门的C/C++编译器进行编译的,在另一台电脑上全新的环境上运行,发现系统默认执行的是Microsoft Visual C++ (14.0以上版本)下的cl来编译C/C++,而不是python下的cl。

Microsoft C++ 生成工具 - Visual Studio

下Microsoft生成工具,具体安装方法可以搜索“解决报错 Microsoft Visual C++ 14.0 is required”,网上有很多相关文档。

之后就可以正常调用MSVC的cl来编译打包pyd啦。

三、python distutils使用方法

下面记录一下python distutils的使用方法。

  1. 创建一个test文件夹。

  1. 编辑一个test.c,随便写个Hello world就麻烦:

  1. include <Python.h>,以PyMODINIT_FUNC为标志写一个Python Module init函数来Create一个Python Module “test”。

其中,PyObject、PyModule_Create等都定义在Python.h中,并且Python.h已经include了stdio.h。

PyMODINIT_FUNC PyInit_test(void)
{PyObject *m;m = PyModule_Create(&test);if (m == NULL){return Py_BuildValue("");}return m;
}
  1. 定义Python Module “test”,test_methods指向test module的方法。

PyMethodDef test_methods[] = 
{{"hello", hello, METH_VARARGS, "print a hello world"},{NULL, NULL, 0, NULL}
};struct PyModuleDef test = 
{PyModuleDef_HEAD_INIT,"test",                 // name of module /NULL,                   // module documentation, may be NULL /-1,                     // size of per-interpreter state of the module, or -1 if the module keeps state in global variables. /test_methods            // A pointer to a table of module-level functions, described by PyMethodDef values. Can be NULL if no functions are present. /
};
  1. 终于可以写Hello World了,注意返回值类型应为PyObject*,直接把全部代码放上来吧。

#include <Python.h>PyObject* hello()
{printf("Hello World!");return Py_True;
}PyMethodDef test_methods[] = 
{{"hello", hello, METH_VARARGS, "print a hello world"},{NULL, NULL, 0, NULL}
};struct PyModuleDef test = 
{PyModuleDef_HEAD_INIT,"test",                 // name of module /NULL,                   // module documentation, may be NULL /-1,                     // size of per-interpreter state of the module, or -1 if the module keeps state in global variables. /test_methods            // A pointer to a table of module-level functions, described by PyMethodDef values. Can be NULL if no functions are present. /
};PyMODINIT_FUNC PyInit_test(void)
{PyObject *m;m = PyModule_Create(&test);if (m == NULL){return Py_BuildValue("");}return m;
}

  1. 在test目录下创建一个setup.py,编辑如下:

from distutils.core import setup, Extensionmodule1 = Extension('test',sources = ['test.c'])setup (name = 'test',version = '1.0',description = 'test extention',ext_modules = [module1])

name、version等都不必要,只有ext_modules必要。

  1. 执行python setup.py build_ext --inplace,生成test.cp38-win_amd64.pyd,pyd就是python dll,可以直接被python脚本调用的。

  1. 最后写个python脚本test.py调用一下test模块测试一下:

import testtest.hello()

输出Hello World!,完美。


http://chatgpt.dhexx.cn/article/siYb71gS.shtml

相关文章

inplace-operation-error 【已解决】

最近在搞CT医学图像分割模型的领域泛化优化&#xff0c;结果就出现了报错&#xff1a; 关于这个问题stackoverflow上有非常多的讨论&#xff0c;可以过去围观&#xff1a; 指路&#xff1a;中文版stackoverflow - 堆栈内存溢出 (stackoom.com) Stack Overflow - Where Develo…

pandas数据排序sort_values后面inplace=True与inplace=False的实例驱动理解

目 录 1 引子 2 inplace参数理论理解 3 inplace参数实例驱动理解 3.1 inplace True 3.2 inplace False 1 引子 Series 的排序&#xff1a;Series.sort_values(ascendingTrue, inplaceFalse) 参数说明&#xff1a; ascending&#xff1a;默认为True升序排序&#xff0c;为F…

Python中inplace参数

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 Python中inplace参数 [太阳]选择题 对于以下python代码表述错误的一项是? import pandas as pd df pd.DataFrame({c1:[11undefined22]}) print(【执行】print(df):\nundefineddf) print(【…

inplace=True (原地操作)

Pytorch的很多地方有inplace这个参数&#xff0c;最近遇到的是nn.ReLU(inplaceTrue)。还有torch.sigmoid_等 inplace默认是False inplace的含义是是否进行覆盖运算。即改变一个tensor的值的时候&#xff0c;不经过复制操作&#xff0c;而是直接在原来的内存上改变它的值 比如&a…

Pytorch中inplace操作

文章目录 前言Inplace操作概述inplace操作的优缺点常见的inplace操作总结参考链接 前言 之前在写训练代码时&#xff0c;遇到了inplace operation导致的问题&#xff0c;所以就了解了一下pytorch的inplace operation&#xff0c;在此记录一下inplace操作的一些知识。报错信息如…

PyTorch的inplace的理解

inplace的理解 我们平时看到的 nn.ReLU(inplaceTrue)、nn.LeakyReLU(inplaceTrue)&#xff0c;这些语句中的inplace是什么意思&#xff1f; inplaceTrue指的是进行原地操作&#xff0c;选择进行原地覆盖运算。 比如 x1则是对原值x进行操作&#xff0c;然后将得到的结果又直接覆…

mysql如何改连接端口号_MYSQL修改端口号

系统&#xff1a;Windows Server 2016 MYSQL版本&#xff1a;5.7.20 1、打开MYSQL根目录查看是否存在my.ini&#xff0c;若不存在&#xff0c;创建一个my.ini文件 复制下面的code到my.ini中 [client] port2512 default-character-setutf8 [mysqld] # 设置为自己MYSQL的安装目录…

Linux如何查询mysql的端口号

Linux如何查询mysql的端口号 如何查询mysql的端口号&#xff08;使用root&#xff09;&#xff1a; netstat -anp|grep mysql netstat -anp|grep mysql

MAC:查看和更改Mysql端口号(保姆级解决方案)

MAC:查看和更改Mysql端口号 第零步&#xff1a; 进入终端&#xff0c;使用sudo su命令&#xff0c;并输入用户密码开启root高权限 sudo su第一步&#xff1a; 终端输入命令如下&#xff0c;输入密码后进入mysql mysql -u root -p第二步&#xff1a; 输入命令&#xff08;…

查看 mysql端口 和进程_mysql 端口号(怎么查看mysql的端口号)

mysql 端口号(怎么查看mysql的端口号) 2020-05-07 21:54:58 共10个回答 如何查看mysql的端口号 --输入以下命令:SHOWVARIABLESWHEREVARIABLE_NAMEport就可以查看当前连接的端口号,--例如:mysql>SHOWVARIABLESWHEREVARIABLE_NAMEport; mysql的默认端口号是多少 mysql默认端口…

mysql有多少个端口号_mysql默认端口号(mysql端口号是多少)

mysql默认端口号(mysql端口号是多少) 2020-05-07 22:14:36 共10个回答 mysql的默认端口号是多少 mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf mysql使用的默认端口号是哪个端口 mysql的默认端口是3306,可以编辑用户目录下的.my.cnf文件进行修改.sqlserver默…

linux mysql修改端口号

1.登陆MySQL数据库 mysql -u root -p 2.输入show global variables like port;查看当前端口号 mysql> show global variables like port; Ps:port后面的值就是当前端口号 3.修改mysql配置文件&#xff0c;一般是在/etc/my.cnf&#xff0c;早期版本有可能是my.conf文件…

宝塔面板修改mysql端口号

为了站点安全起见&#xff0c;常用端口都建议修改&#xff0c;那么宝塔面板的Mysql端口需要怎么修改呢&#xff1f; 1、 找到软件商店-运行环境-Mysql-的设置菜单 2、打开后选择端口选项&#xff0c;将默认的3306改为自定义端口。 3、改完端口后记得在安全菜单中放行修改后的…

mysql有多少个端口号_查看mysql端口号(mysql端口号是多少)

查看mysql端口号(mysql端口号是多少) 2020-05-07 22:11:45 共10个回答 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出.总结:注…

【修改MySQL端口号(没有my.ini文件)详细图解】

修改MySQL端口号&#xff08;没有my.ini文件&#xff09; 前置方案安装服务方案 前置方案 PS&#xff1a;修改MySQL端口号&#xff0c;网上大部分都是修改my.ini文件 有my.ini文件的参考地址 安装服务方案 对于没有my.ini文件使用如下步骤&#xff1a; 1&#xff0c;已安装M…

Docker部署项目更改Mysql端口号

问题情景&#xff1a; 师弟在阿里云服务器上通过Tomcat部署java Web项目 程序端口8080 mysql端口3306 我通过Dokcer部署了前后端分离项目&#xff0c;为了避免端口冲突&#xff0c;服务器6612&#xff1a;3306映射端口。 本以为需要在java后端配置文件中更改url为&#xff1…

linux下查看mysql端口号和修改端口号方法

一、查看端口号 1、登录mysql [rootlocalhost ~]# mysql -uroot -p Enter password: 输入数据库密码&#xff1b; 2、使用show global variables like port; 命令查看端口号, 3307即为当前端口号。 二、修改mysql端口号 1、编辑/etc/my.cnf文件 [rootlocalhost ~]# vi /…

linux下修改mysql端口号

1.登录mysql mysql -u root -p 2.查看当前端口号 show global variables like port; 3.修改端口 vim /etc/my.cnf 4. 增加或修改端口参数&#xff0c;然后保存退出 port3308 5.重启mysql service mysqld restart 6.查看mysql状态 systemctl status mysqld 7.阿里云上安全…

如何修改mysql占用的端口号_修改mysql端口号(mysql的端口号)

修改mysql端口号(mysql的端口号) 2020-05-07 22:12:00 共10个回答 如何查看mysql默认端口号和修改端口号 登录mysql,使用命令showglobalvariableslikeport;查看端口号修改端口在配置文件my.ini,修改后重新启动.[mysqld]port3506 如何修改修改mysql默认端口号3306 在配置文件my.…

虚拟机查看MySQL端口号

先进入MySQL mysql -hhadoop102 -uroot -p 再查看端口号 show variables like ‘port’;