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

这篇具有很好参考价值的文章主要介绍了python distutils打包C/C++模块,执行python setup.py build_ext --inplace时报错cl。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题发生环境

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, Extension


module1 = 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脚本调用的。

python distutils打包C/C++模块,执行python setup.py build_ext --inplace时报错cl
  1. 最后写个python脚本test.py调用一下test模块测试一下:

import test

test.hello()

输出Hello World!,完美。文章来源地址https://www.toymoban.com/news/detail-455975.html

到了这里,关于python distutils打包C/C++模块,执行python setup.py build_ext --inplace时报错cl的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 已解决Building wheel for lxml (setup.py) … error

    已解决(pip安装第三方模块lxml模块报错)Building wheels for collected packages: lxml Building wheel for lxml (setup.py) … error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. note: This error originates from a subprocess,and is likely not a problem with pip. ERROR: Failed building wheel for lxml n

    2024年02月13日
    浏览(39)
  • ROS 2 colcon build报错SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip

    我们在ROS 2 中使用colcon build时,出现以下问题 SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools. 我们可以尝试运行构建完毕的程序,是否能正常执行(或者我们可以使用以下指令把ROS2/examples 拉下来测试一下) 依旧colcon build ,依旧出现这样

    2024年02月15日
    浏览(59)
  • 【Python打包成exe】快速将多个py文件及其他文件打包为exe可执行文件

    尝试了很多种Python打包为exe可执行文件的方式,通过总结,得出一种最简洁、最有效的打包方式分享给大家! 准备好将要打包的工程文件(夹) 如上图所示, 首先将主文件UI.py和文件夹./file放在一级文件夹./YW下方,如果有同级其他.py文件与UI.py放在同一级文件夹即可! 然后

    2024年01月21日
    浏览(46)
  • 如何将Python文件.py打包成.exe可执行程序(最简教程吗)

    相信对python有过学习的朋友都知道可以用IDLE编写并跑一跑python, 但是 如何做到别人电脑没有装python的情况下运行python的脚本呢?( 看标题 ) 这里简单提一下.exe 可执行程序   .exe是文件扩展名,带有.exe扩展名的文件名按下Enter 键就可运行。这么个意思不就是: 不需要有p

    2024年02月05日
    浏览(109)
  • py2exe打包Python程序为Windows下的exe执行文件

    py2exe 是一个将 Python 脚本转换成 Windows 上可独立执行的**.exe 程序的工具,这样就可以在不用装Python解析器的情况下在 Windows**系统上运行这个可执行程序。 py2exe 已经被用于创建 wxPython 、 Tkinter 、 Pmw 、 PyGTK 、 pygame 、 win32com client和server ,和其它的独立程序。 py2exe 是发布在开

    2024年02月04日
    浏览(47)
  • 【Python小工具】解决Python的Pyinstaller将.py文件打包成.exe可执行文件后文件过大的问题

    在文章 【Python小项目】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件中我们实现了一个python小项目的制作并将其打包成了.exe可执行文件。但是,当我们查看了一下文件大小后,好家伙,一百多行代码打包完竟然有242M。于是,我们静下心来思考,是不

    2024年02月10日
    浏览(56)
  • 科普:python怎么使用Pyinstaller模块打包成可执行文件

    创建个虚拟环境来打包,以免把整个系统的乱七八糟的pip的都打包进去,建议每个项目创建对应的虚拟环境。 比如: conda create -n myenv python=3.10 PS:还需要安装项目依赖的其他模块,建议用requirements.txt文件安装 -h,–help 查看该模块的帮助信息 -F,-onefile 产生单个的可执行文

    2024年02月08日
    浏览(58)
  • 【python】之pyinstaller模块,python程序打包成一个可执行exe 文件(超详细)!

    PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结(打包)为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序 使用pip接口进行安装 1.打开命令行: 切换到要转换的python文件路径,输入上述指令。 (1)-F: 只生成一个单个文件(只有一个

    2024年02月12日
    浏览(62)
  • python - 安装pyqt5模块,PyCharm配置QtDesigner/Pyuic/Pyrcc,ui转py文件,图片转ico/icns格式,pyinstaller/py2app打包代码

    window配置Python+PyQt5+QtDesigner+PyUic+PyRcc(最全安装教程):https://blog.csdn.net/baidu_35145586/article/details/108110236 MacOS配置Pycharm+Python+PyQt5+QtDesigner+PyUic+PyRcc: https://blog.csdn.net/lkhk2008/article/details/116019386 QtDesigner工具的使用(界面与业务逻辑分离实现):https://blog.csdn.net/weixin_62094306/art

    2024年02月03日
    浏览(49)
  • python setup.py install 报错的解决

    可能是由于 Windows 的应用沙箱安全性限制导致的。在某些情况下,即使以管理员身份运行 PowerShell,也无法在受限的目录中创建或修改文件。 解决此问题的一种方法是选择一个不受限制的目录来安装 Python 包。你可以使用 --user 标志将包安装到用户目录而不是系统目录中。尝试

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包