Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python引用调用或等效调用_Python_C_Ssl_Pass By Reference - Fatal编程技术网

Python引用调用或等效调用

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.

我想在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.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