Python引用调用或等效调用
我想在Python中使用SSL库,我需要编写一个C++代码的克隆代码。 在C中,SSL函数的调用方式如下:Python引用调用或等效调用,python,c,ssl,pass-by-reference,Python,C,Ssl,Pass By Reference,我想在Python中使用SSL库,我需要编写一个C++代码的克隆代码。 在C中,SSL函数的调用方式如下: EVP_MD_CTX mdctx; EVP_MD_CTX_init(&mdctx) 在Python中,我访问了SSL库: import ctypes import ctypes.util import platform from os import linesep libraries = {} libraries["c"] = ctypes.CDLL(ctypes.util.
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx)
在Python中,我访问了SSL库:
import ctypes
import ctypes.util
import platform
from os import linesep
libraries = {}
libraries["c"] = ctypes.CDLL(ctypes.util.find_library("c"))
if platform.system() != "Windows":
libraries["ssl"] = ctypes.CDLL(ctypes.util.find_library("ssl"))
else:
libraries["ssl"] = ctypes.CDLL(ctypes.util.find_library("libeay32"))
EVP_MD_CTX_init = libraries['ssl'].EVP_MD_CTX_init
EVP_MD_CTX_init.restype = ctypes.c_void_p
EVP_MD_CTX_init.argtypes = [ctypes.c_void_p]
这是从
如何通过引用传递EVP_MD_CTX_init函数,因为它是在C中生成的?
因为我没有访问EVP_MD_CTX_init()方法的权限。我必须使用“按引用传递”调用此方法
我尝试了EVP_MD_CTX_init(ctypes.byref(mdctx))但出现了语法错误。有什么方法可以做到这一点吗?您应该查阅ctypes 方法是使用
ctypes
模块导出的byref()
或pointer()
(更慢、更复杂)函数,如示例所示
>>> print ctypes.byref.__doc__
byref(C instance[, offset=0]) -> byref-object
Return a pointer lookalike to a C instance, only usable
as function argument
这在
ctypes
文档中进行了解释,在:
有时,C api函数需要一个指向数据类型的指针作为参数,可能会写入相应的位置,或者如果数据太大,无法通过值传递。这也称为通过引用传递参数
ctypes导出用于通过引用传递参数的byref()
函数。使用pointer()
函数也可以达到同样的效果,尽管pointer()
由于构造了一个真正的指针对象,所以需要做更多的工作,因此如果Python本身不需要指针对象,那么使用byref()
会更快:
但是,现在已经提供了代码,您并没有试图将其传递给需要指针的C函数,而是尝试将其传递给Python函数 如果您想这样做,正如文档所解释的,您需要使用
指针
,而不是byref
。当然,Python函数需要一个指针(c_int)
,而不是c_int
但在这方面,你甚至没有真正做到这一点。您已经编写了以下代码:
a=ctypes.c_int(35)
def foo(n):
n=ctypes.c_int(19)
您没有对传入的值执行任何操作;您只是将本地名称n
重新绑定到另一个新构造的值
您只需在此处更改值:
def foo(n):
n.value = 19
那么这里就不需要
byref
或指针了。这没有帮助,因为我想在函数/方法中将它用作参数。@bOK:查看我编辑的答案。但既然你又编辑了这个问题,我不确定我是否明白你在问什么。我又编辑了一遍,我想现在已经很清楚了。谢谢,我重新开始你的问题,因为我以为你所要求的实际上不是你的重复。然后你编辑了这个问题,删除了所有相关的内容,所以剩下的实际上是重复的。为什么要这样做?更重要的是:您是在问如何通过引用C函数传递ctypes
值,如何通过引用Python函数传递ctypes
值,还是仅仅是如何在Python中变异ctypes
值?它们都是不同的东西,如果你问其中一个问题的答案,它不会帮助你做其他的事情。如果你想让我们调试你的代码,你必须向我们展示代码和你得到的错误,而不仅仅是模糊地描述你尝试了什么和发生了什么。表达式EVP_MD_CTX_init(ctypes.byref(mdctx))
中没有语法错误,因此您的尝试很可能存在其他问题,但在没有看到它的情况下,我甚至无法猜出是什么。它可能是前一行中缺少的)
,一个非ASCII字符,或者一百万其他东西。
def foo(n):
n.value = 19