文件管理 · 2022年8月22日

python调用c可执行文件|如何在python中调用C语言代码

『壹』 python 调用C可执行程序

比如参数是ARG1,ARG2,输入字符串是TESTimport subprocess as sub p = sub.Popen(['alignment ARG1 ARG2'], shell = True, stdin = sub.PIPE, stdout = sub.PIPE, stderr = sub.PIPE)(out,err) = p.communicate(input = 'TEST')out是执行后的标准输出“问题补充:那个C可执行程序需要CTRL + C 才能退出,就不知道该怎么办了”可以发送SIGINT信号给可执行程序Popen.send_signal(signal)等同于ctrl + c

『贰』 怎样让Python脚本与C++程序互相调用

二、Python调用C/C++1、Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。(1)C语言文件:pycall.c[html] view plain /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h> int foo(int a, int b) { printf("you input %d and %d\n", a, b); return a+b; } (2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。(3)Python调用动态库的文件:pycall.py[html] view plain import ctypes ll = ctypes.cdll.LoadLibrary lib = ll("./libpycall.so") lib.foo(1, 3) print '***finish***' (4)运行结果:2、Python调用C++(类)动态链接库 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。(1)C++类文件:pycallclass.cpp[html] view plain #include <iostream> using namespace std; class TestLib { public: void display(); void display(int a); }; void TestLib::display() { cout<<"First display"<<endl; } void TestLib::display(int a) { cout<<"Second display:"<<a<<endl; } extern "C" { TestLib obj; void display() { obj.display(); } void display_int() { obj.display(2); } } (2)g++编译生成动态库libpycall.so:g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp。(3)Python调用动态库的文件:pycallclass.py[html] view plain import ctypes so = ctypes.cdll.LoadLibrary lib = so("./libpycallclass.so") print 'display()' lib.display() print 'display(100)' lib.display_int(100) (4)运行结果:3、Python调用C/C++可执行程序(1)C/C++程序:main.cpp[html] view plain #include <iostream> using namespace std; int test() { int a = 10, b = 5; return a+b; } int main() { cout<<"—begin—"<<endl; int num = test(); cout<<"num="<<num<<endl; cout<<"—end—"<<endl; } (2)编译成二进制可执行文件:g++ -o testmain main.cpp。(3)Python调用程序:main.py[html] view plain import commands import os main = "./testmain" if os.path.exists(main): rc, out = commands.getstatusoutput(main) print 'rc = %d, \nout = %s' % (rc, out) print '*'*10 f = os.popen(main) data = f.readlines() f.close() print data print '*'*10 os.system(main) (4)运行结果:4、扩展Python(C++为Python编写扩展模块) 所有能被整合或导入到其它python脚本的代码,都可以被称为扩展。可以用Python来写扩展,也可以用C和C++之类的编译型的语言来写扩展。Python在设计之初就考虑到要让模块的导入机制足够抽象。抽象到让使用模块的代码无法了解到模块的具体实现细节。Python的可扩展性具有的优点:方便为语言增加新功能、具有可定制性、代码可以实现复用等。 为 Python 创建扩展需要三个主要的步骤:创建应用程序代码、利用样板来包装代码和编译与测试。(1)创建应用程序代码[html] view plain #include <stdio.h> #include <stdlib.h> #include <string.h> int fac(int n) { if (n < 2) return(1); /* 0! == 1! == 1 */ return (n)*fac(n-1); /* n! == n*(n-1)! */ } char *reverse(char *s) { register char t, /* tmp */ *p = s, /* fwd */ *q = (s + (strlen(s) – 1)); /* bwd */ while (p < q) /* if p < q */ { t = *p; /* swap & move ptrs */ *p++ = *q; *q– = t; } return(s); } int main() { char s[BUFSIZ]; printf("4! == %d\n", fac(4)); printf("8! == %d\n", fac(8)); printf("12! == %d\n", fac(12)); strcpy(s, "abcdef"); printf("reversing 'abcdef', we get '%s'\n", \ reverse(s)); strcpy(s, "madam"); printf("reversing 'madam', we get '%s'\n", \ reverse(s)); return 0; } 上述代码中有两个函数,一个是递归求阶乘的函数fac();另一个reverse()函数实现了一个简单的字符串反转算法,其主要目的是修改传入的字符串,使其内容完全反转,但不需要申请内存后反着复制的方法。(2)用样板来包装代码 接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject* Mole_func()的包装函数;c、为每个模块增加一个型如PyMethodDef MoleMethods[]的数组;d、增加模块初始化函数void initMole()。

『叁』 python 怎么调用c语言接口

ctypes: 可直接调用c语言动态链接库。

使用步骤:

1> 编译好自己的动态连接库2> 利用ctypes载入动态连接库3> 用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:

#Step1:test.c#include<stdio.h>intadd(inta,intb){returna+b;}#Step2:编译动态链接库(如何编译动态链接库在本文不详解,网上资料一大堆。)gcc-fPIC-sharedtest.c-olibtest.so#Step3:test.pyfromctypesimport*mylib=CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")add=mylib.addadd.argtypes=[c_int,c_int]#参数类型,两个int(c_int是ctypes类型,见上表)add.restype=c_int#返回值类型,int(c_int是ctypes类型,见上表)sum=add(3,6)

『肆』 如何在python中调用C语言代码

先把C语言代码做成DLL文件,再用python加载此DLL文件来访问C语言功能代码

『伍』 python中3种调用可执行文件.exe的方法

方法一、os.system() 会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来。import osmain = "project1.exe"r_v = os.system(main)print (r_v )方法二、commands.getstatusoutput() 会保存可执行程序中的打印值和主函数的返回值,但不会将执行过程中要打印的内容打印出来。import subprocessimport osmain = "project1.exe"if os.path.exists(main):rc,out= subprocess.getstatusoutput(main)print (rc)print ('*'*10)print (out)方法三、popen() 会保存可执行程序中的打印值,但不会保存主函数的返回值,也但不会将执行过程中要打印的内容打印出来。import osmain = "project1.exe"f = os.popen(main)data = f.readlines()f.close()print (data)另外,上面提到的三种方式,实际上都是在python中执行命令,因此他们不只是用来执行可执行文件,也可以用来执行linux系统中别的指令。关于python中3种调用可执行文件.exe的方法,环球青藤小编就和大家分享到这里了,学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚。如果您还想继续了解关于python编程的学习方法及素材等内容,可以点击本站其他文章学习。

『陆』 python调用c函数

Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过1. Python 调用 C (base)想在python中调用c函数, 如这儿的fact#include <Python.h>int fact(int n){ if (n <= 1) return 1; else return n * fact(n – 1);}PyObject* wrap_fact(PyObject* self, PyObject* args){ int n, result; if (! PyArg_ParseTuple(args, "i:fact", &n)) return NULL; result = fact(n); return Py_BuildValue("i", result);}static PyMethodDef exampleMethods[] ={ {"fact", wrap_fact, METH_VARARGS, "Caculate N!"}, {NULL, NULL}};void initexample(){ PyObject* m; m = Py_InitMole("example", exampleMethods);} 把这段代码存为wrapper.c, 编成so库,gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config 然后在有此so库的目录, 进入python, 可以如下使用import exampleexample.fact(4) 2. Python 调用 C++ (base)在python中调用C++类成员函数, 如下调用TestFact类中的fact函数,#include <Python.h>class TestFact{ public: TestFact(){}; ~TestFact(){}; int fact(int n);};int TestFact::fact(int n){ if (n <= 1) return 1; else return n * (n – 1);}int fact(int n){ TestFact t; return t.fact(n);}PyObject* wrap_fact(PyObject* self, PyObject* args){ int n, result; if (! PyArg_ParseTuple(args, "i:fact", &n)) return NULL; result = fact(n); return Py_BuildValue("i", result);}static PyMethodDef exampleMethods[] ={ {"fact", wrap_fact, METH_VARARGS, "Caculate N!"}, {NULL, NULL}};extern "C" //不加会导致找不到initexamplevoid initexample(){ PyObject* m; m = Py_InitMole("example", exampleMethods);} 把这段代码存为wrapper.cpp, 编成so库,g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config 然后在有此so库的目录, 进入python, 可以如下使用import exampleexample.fact(4) 3. Python 调用 C++ (Boost.Python)Boost库是非常强大的库, 其中的python库可以用来封装c++被python调用, 功能比较强大, 不但可以封装函数还能封装类, 类成员.http://dev.gameres.com/Program/Abstract/Building%20Hybrid%20Systems%20with%20Boost_Python.CHN.by.JERRY.htm首先在ubuntu下安装boost.python, apt-get install libboost-python-dev#include <boost/python.hpp>char const* greet(){ return "hello, world";}BOOST_PYTHON_MODULE(hello){ using namespace boost::python; def("greet", greet);}把代码存为hello.cpp, 编译成so库g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1 此处python路径设为你的python路径, 并且必须加-lboost_python-gcc42-mt-1_34_1, 这个库名不一定是这个, 去/user/lib查 然后在有此so库的目录, 进入python, 可以如下使用>>> import hello>>> hello.greet()'hello, world' 4. python 调用 c++ (ctypes)ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python – in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.http://python.net/crew/theller/ctypes/ #include <Python.h>class TestFact{ public: TestFact(){}; ~TestFact(){}; int fact(int n);};int TestFact::fact(int n){ if (n <= 1) return 1; else return n * (n – 1);}extern "C"int fact(int n){ TestFact t; return t.fact(n);}将代码存为wrapper.cpp不用写python接口封装, 直接编译成so库,g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config 进入python, 可以如下使用>>> import ctypes>>> pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')>>> pdll.fact(4)12

『柒』 python如何调用编译后的可执行文件

我是通过python调用shell脚本运行可执行文件的接口实现对方给的功能。简单讲就是,写了个shell脚本运行可执行文件,并传入参数,实现功能。之后再通过python调用脚本来实现这个功能。

『捌』 c可以调用python吗

可以的。C中内嵌Python新建立一个工程,首先需要将工作目录设置到Python-3.1.1PCbuild中,以获取到动态库,至于静态库的包含,Include目录的指定,那自然也是少不了的。文件中需要包含Python.h文件,这也是必须的。接口中Py_Initialize();Py_Finalize();其他的根据需求,再引入相应的python builder 即可

『玖』 python调用c语言编译器

如何让python调用C和C++代码安装python后,会有一个chm格式的python手册。要搞明白如何让python调用C/C++代码(也就是写python的 extension),你需要征服手册中的<<Extending && embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他 书籍,最终在<<Python Programming On Win32>>书中找到了教程。 下面记录一下如何在visual studio 2005中,写一段C/C++的MessageBox代码,然后提供后python调用,最后的结果当然是显示一个MessageBox. 1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个 dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:\Program Files\Python25\DLLs),假如我们接下来要写的扩展mole名为mb,python调用的代码为: import mb mb.showMsg("Python's really amazing, I kindda love it!") python怎么找到我们的mb模块呢?就是上面说的,我们要生成一个mb.dll,然后拷贝到Dlls目录下面,为了区别普通的dll和python专用扩展的dll,我们的 mb.dll修改成mb.pyd(python dll) 2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。 在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:\Program Files\Python25\include"),然后选择库文件,添加python的libs目录(我的机器上是"F:\Program Files\Python25\libs")。 既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码: #include <python.h> //python.h是包含python一些定义的头文件,在python的include目录下 /* 我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll, 想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息

『拾』 如何让python调用C和C++代码

二、Python调用C/C++1、Python调用C动态链接库Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。(1)C语言文件:pycall.c[html]viewplain/***gcc-olibpycall.so-shared-fPICpycall.c*/#include#includeintfoo(inta,intb){printf("youinput%dand%d\n",a,b);returna+b;}(2)gcc编译生成动态库libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern"C"来进行编译。(3)Python调用动态库的文件:pycall.py[html]viewplainimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)运行结果:2、Python调用C++(类)动态链接库需要extern"C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern"C",构建后的动态链接库没有这些函数的符号表。(1)C++类文件:pycallclass.cpp[html]viewplain#includeusingnamespacestd;classTestLib{public:voiddisplay();voiddisplay(inta);};voidTestLib::display(){cout#include#includeintfac(intn){if(n<2)return(1);/*0!==1!==1*/return(n)*fac(n-1);/*n!==n*(n-1)!*/}char*reverse(char*s){registerchart,/*tmp*/*p=s,/*fwd*/*q=(s+(strlen(s)-1));/*bwd*/while(p