导航:首页 > 编程语言 > python写dll

python写dll

发布时间:2023-03-29 21:33:44

⑴ 如何把python库文件做成动态链接库

你只能用python调用dll库,想那些底层的东西一般都是用c来写的所以下面我给您提供一个调用方式
import ctypes

dll = ctypes.WinDLL('yourDll.dll')
print dll.Sun(1+2)
print dll.count('abacadeafg',ord('a'))

⑵ 如何让python调用C和C++代码

要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<<Extending && embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<<Python Programming On Win32>>书中找到了教程。
1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展mole名为mb,python调用的代码为:import mbmb.showMsg("Python's really amazing, I kindda love it!")
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中包含调试信息*/#pragma comment(lib, "python25.lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用
extern "C" __declspec(dllexport) void initmb(){/*当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = {
{"showMsg", mb_showMsg, METH_VARARGS},
{NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里
PyObject *m = Py_InitMole("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple
static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数
const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,
如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,
这个函数的原型是类似printf的不定参数的形式
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);*/if (!PyArg_ParseTuple(args, "s", &msg))
return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb.showMsg("Python's really amazing, I kindda love it!")

⑶ 创建 可以被python调用的 dll

如果经过亏缺stdcall声明的方法,如果不是用def文件声明的导出拿胡函数或者extern “C” 声明的话,编译器会对函数名进行修改;在编译加上extern C;这样就OK了;
另外可以在PYTHON代销敏辩码里试试这样:
ctypes.cdll.LoadLibrary("dllpath")

⑷ Windows下如何在python中调用c语言程序编译的dll

这个dll可能是用borland公司的编译器编译出来的。 或者这个dll可能不是在你本机上编译的,如果你有这个dll的源码,可以编译一下,然后放到脚本同一目录下,再试试。

⑸ python调用dll中的函数时报错

似乎代码里没有看到你没有加载DLL啊。
另外你在c里直接改写python的内存可能不太妥当。通常是在C里构造后,再返回到python里去。

从你的程序上看,调用完Thin后,你的变量p似乎变成了空指针。

ctypes调用DLL通常都是别人做好的DLL,没有办法才自己去调用。这里有好多麻烦事情。

如果是自己写代码,通常会建议你用cython这个模块。很容易就实现接口。你也不用担心这些变量类型与接口封装的问题。

另外我印象中dll似乎与编译器也有关系。用VC可能容易些。用BC,或者是GCC就麻烦些。

另外还有版本的问题,64位与32位不能通用。

原则上讲,你这种用法,也不是不可以,可能还是哪个地方没有弄对。比如编译参数。你可以试试用return type把数据带回来。而不是用指针写内存。

因为p目前按理它是常量,很有可能调用机制中,不会让你改写它。

⑹ python有没有办法能够编译成DLL文件

通用情况下,没有什么好办法能把python编译成dll,因为python是解释型语言,dll是编译后的二进制文件,2者不在一个次元。除非你把python的解释器也打包进你的工程,并在你的exe里调用。
但某些特殊情况下,也有把python的代码编译成dll文件的方法,在.net环境下,可以用IronPython这个工具,它可以把python代码编译成dll。

⑺ 我现在想把自己写的python模块源代码封装成dll,然后在别的python脚本里调用,可以吗

可以的,只要把python模块转换成dll模块,利用Python自带的ctypes模块加载调用就行。

ctypes 是Python的外部函数库。它提供了与 C语言兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。

ctypes导出了cdll对象,在 Windows 系统中还导出了windll和oledll对象用于载入动态链接库。通过操作这些对象的属性,你可以载入外部的动态链接库。cdll载入按标准的cdecl调用协锋滚议导出的函数,而windll导入的库按stdcall调用协议调用其中的函数。

(7)python写dll扩展阅读:

加载调用DLL的相关方法:

1、加载DLL银扒余

加载的时候要根据你将要调用的函数是符合什么调用约定的。

stdcall调用约定:两种加载方式

Objdll = ctypes.windll.LoadLibrary("dllpath")

Objdll = ctypes.WinDLL("dllpath")

cdecl调用约定:也有两种加载方式

Objdll = ctypes.cdll.LoadLibrary("dllpath")

Objdll = ctypes.CDLL("dllpath")

其实windll和cdll分别是WinDLL类和CDll类的对象。

2、调用dll中的方法

加载dll的时候会返回一个DLL对象(假设名字叫Objdll),利用该对象就可以调用dll中的方法。 e.g.如果dll中有个方法名字叫Add(注意如果经过stdcall声明的方法,如果不是用def文件声明的导出函数或者extern “C” 声明的话,编译器会对函数名进行修此旦改,这个要注意。)

调用:nRet = Objdll.Add(12, 15) 即完成一次调用。

⑻ 有谁知道python怎么调用c#的dll

1、首选运行工具 makepy.py。

⑼ python使用ctypes调用C编译dll函数方法

在函数声明加入前缀,如
__declspec(dllexport) int Fun(int a, int b)
否则在加载该dll时会提示找不到该符号

在windows下可以通过vs自带的mpbin工具查看可被调用符号烂备
mpbin /exports test.dll

C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程派历信序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定

python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件,根据C dll的调用规定不同需要使用不同接口,使用ctypes需要 import ctypes 库

对于简单的C函数,例如 int add(int a, int b) , 此时就可以直接调用了,如

对于较复杂的C函数的参数情况,ctypes调用时对入参和出餐做一定处理,这里分情况讨论尘轮

以上包含了几种主要的参数传递情况,ctypes也提供了一个较为完整的python类型和C类型的对照,如下:

⑽ python源代码程序文件扩展名

python源文件后缀是py。
以 py 扩展名的文件是 Python 源码文件,由 python.exe 解释,可在控制台下运行。可用文本编辑器读写。
Python中经常使用的文件后缀名:
pyc
以 pyc 为扩展名的是Python的编译文件。其执行速度快于 py 文件且不能用文本编辑编辑查看。所以 pyc 文件往往代替 py 文件发布。
Python 在执行时,首先会将 py 文件中的源代码编译成 PyCodeObject 写入 pyc 文件,再由虚拟机执行 PyCodeObject。
当 Python 执行 import 时会先寻找对应的 pyc或 pyd(dll)文件,如果没有则将对应的py文件编译写入 pyc 文件。pyc文件也可以通过 python -m py_compile src.py 生成。
pyw
pyw 文件与 pyc 文件相似,但 pyw 执行的时候不会出控制台窗口。开发(纯图形界面程序)时可以暂时把 pyw 改成 py 以调出控制台窗口调试。
pyo
pyo 是优化编译后的程序,不能用文本编辑器编辑。 python -O source.py 即可将源程序编译为 pyo 文件。
pyd
pyd 一般是 Python 外的其他语言如 C/C++ 编写的 Python 扩展模块,即 Python 的一个动态连接库,与 dll 文件相当。在Linux系统中一般为.so文件

阅读全文

与python写dll相关的资料

热点内容
excel表格单列数据加密 浏览:646
给同事的解压话语 浏览:990
linux关闭网卡命令行 浏览:452
史上最漂亮程序员 浏览:768
java实现excel的导入 浏览:758
光遇账号如何转移安卓 浏览:266
5分之13除以26的算法 浏览:342
兰州安宁区买解压包子 浏览:641
php接收图片代码 浏览:668
hci命令 浏览:662
福建服务器大区云空间 浏览:840
笔杆子程序员 浏览:745
手机软件易验证加密 浏览:589
文档加密只读模式也不能看到 浏览:431
把jpg转换成pdf的软件 浏览:874
linuxeth0mac 浏览:192
windows编程知乎 浏览:442
压缩工期超过40 浏览:249
Android怎么优化内存 浏览:106
linuxetcsysconfig 浏览:396