Python与C语言交互调用教程与示例

需积分: 1 0 下载量 187 浏览量 更新于2025-02-05 收藏 262KB RAR 举报
标题中提到的是“python 基础调用C”,意味着这个文档主要是围绕Python如何调用C语言编写的函数进行说明。描述中包含了一个C语言的函数示例以及对应的Python代码,用于展示如何通过Python使用ctypes库调用C语言的共享库(.so文件)中的函数。此外,描述还涉及到了参数类型转换的情况,特别是如何处理double类型的参数。标签“python 调用C示例”进一步明确了文档的主题范围。下面将详细解释相关知识点。 ### 知识点一:C语言函数编写 在描述中给出的C语言函数示例是: ```c int two_add_int(int a, int b) { return a + b; } ``` 这个函数非常简单,它接收两个整型参数,并返回它们的和。为了能在Python中调用,需要将此函数编译成共享库(在Linux下是.so文件)。对于需要修改参数类型为double的情况,描述中给出了另一个函数: ```c double add_double(double a, double b) { return a + b; } ``` 这个函数和第一个函数逻辑上是相同的,只是参数类型改为了double,用于处理浮点数加法。 ### 知识点二:ctypes库使用 Python的ctypes模块是一个非常重要的工具,它允许Python代码调用动态链接库中的函数,包括C语言编写的库。在描述中,展示了如何使用ctypes模块来调用C语言库中的函数。 从描述中可以看到,首先需要导入ctypes模块: ```python from ctypes import * ``` 接着,创建一个CDLL对象,它代表了共享库(在Linux下是.so文件): ```python C_lib = CDLL(“test.so”) ``` 之后,就可以像调用Python函数一样调用C库中定义的函数了: ```python a,b = 1,2 c = C_lib.two_add_int(a,b) ``` 对于double类型的参数,调用方式类似: ```python a = 1.2 b = 3.4 c = C_lib.add_double(a,b) ``` ctypes提供了许多数据类型,比如c_int和c_double,可以用来指定期望的函数参数和返回值类型。这个例子中没有显示指定,ctypes会根据参数类型自动匹配,但当遇到类型不匹配时,则需要显式指定。 ### 知识点三:参数和返回值的处理 在Python与C语言交互的过程中,参数传递和返回值的处理是非常重要的。Python中的整型和浮点型分别对应C语言中的int和double类型。当使用ctypes调用C函数时,Python自动将对应的数据类型参数传递给C函数。 然而,如果C函数的参数或者返回值类型不是Python内置的对应类型,比如C中的void指针、结构体等,可能需要使用ctypes提供的其他数据类型(如c_void_p、Structure等)或者通过设置属性的方式进行转换。 ### 知识点四:混合编程的优缺点 混合编程,即使用不同编程语言编写的程序协同工作的编程方式,具有一定的优点和缺点。其优点在于: - **性能提升**:C语言的执行效率高于Python,对于性能敏感的计算部分可以使用C实现。 - **资源利用**:可以直接使用或复用现有的C语言代码库,不必重新用Python实现。 - **系统调用**:C语言能够直接进行系统级调用,而Python需要额外的库支持。 而其缺点包括: - **复杂性增加**:混合编程使得程序的复杂性增加,需要考虑语言间的接口设计。 - **错误处理**:需要分别处理两语言的错误和异常情况。 - **调试困难**:当混合编程中出现问题时,调试可能会变得更加困难,因为需要分别理解两种语言的调试信息。 ### 知识点五:安全性和兼容性 在进行Python调用C语言函数时,需要注意安全性和兼容性问题: - **类型检查**:应当确保调用C函数时传入正确的数据类型,否则可能导致程序崩溃。 - **内存管理**:C语言需要手动管理内存,而Python有垃圾回收机制,因此在内存共享时需要注意避免内存泄漏。 - **平台兼容性**:编译出的共享库需要和Python运行的平台相匹配,比如32位和64位的差异。 总的来说,从上述信息来看,文档“python 基础调用C.rar”将是一个非常实用的参考资料,向读者展示了如何利用Python的ctypes库来调用C语言函数,同时强调了在处理不同数据类型以及混合编程需要注意的要点。

import urllib.request import queue import threading import sys def bytes2human(n): """ >>> bytes2human(10000) 9K >>> bytes2human(100001221) 95M """ symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') prefix = {} for i, s in enumerate(symbols): prefix[s] = 1 << (i + 1) * 10 for s in reversed(symbols): if n >= prefix[s]: value = int(float(n) / prefix[s]) return '%s%s' % (value, s) return '%sB' % n def gethtml(url, bak): try: urlbak = url + bak #print(urlbak) req = urllib.request.urlopen(urlbak, timeout=10) if req.code == 200: meta = req.info() file_size = int(meta.getheaders("Content-Length")[0]) m = bytes2human(file_size) content_type = meta.getheaders('Content-Type')[0].split(';')[0] if file_size == 0: return False if 'html' in content_type: return False else: print('%s ---- %s ---- %s ' % (urlbak, m, content_type)) return '%s ---- %s ---- %s ' % (urlbak, m, content_type) else: return False except: return False def writefile(fileName, c): f = open(fileName, "a") f.write(c + "\n") f.close() q = queue.Queue() def scanner(url): for i in bekadd(url): c = gethtml(url, i) if c != False: writefile("bak.txt", c) def worker(): while not q.empty(): url = q.get() scanner(url) q.task_done() def bekadd(url): listbak = ['/1.zip', '/1.rar', '/web.rar', '/web.zip', '/www.rar', '/www.zip', '/wwwroot.rar', '/wwwroot.zip', '/backup.rar', '/backup.zip', '/database.rar', '/database.zip', '/databak.rar', '/databak.zip', '/databackup.rar', '/databackup.zip', '/databack.zip', '/sql.rar', '/sql.zip'] wwwurl = url[url.find("http://") + 7:].rstrip("/ 这是什么代码

173 浏览量
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部