【python-C相互调用】python里的dict如何作为参数传入.so中的c语言函数 10C

【python-C相互调用】关于python通过.so调用C函数来读取python里某个key的值并进行处理,一直无法将dict传到C中,求助
1. 首先是C中的包装函数定义

 static PyObject *
Extest_reverse(PyObject *self, PyObject *args,PyObject *keyds)  
{  
    //PyObject* keyds = PyDict_Keys(args);
    static char* kwlist[] = {"name",NULL};
    char *name;    //将dict中的name里的值读到char* name中

    PyObject* retval;  

    if(PyArg_ParseTupleAndKeywords(args,keyds,"isi",kwlist,&name))
    {
       retval = (PyObject *)Py_BuildValue("i",1);
       printf("%s",name);
       free(name);  
       return retval;  //成功读取返回1
    }
    else
    retval = (PyObject *)Py_BuildValue("i",0);
    return retval; //未读取返回0
} 
static PyMethodDef
ExtestMethods[] =
{
    {"reverse",(PyCFunction)Extest_reverse,METH_VARARGS | METH_KEYWORDS,"reverse"},
};
void initwmf()
{
    Py_InitModule("wmf",ExtestMethods);
}
  1. python里的调用 .so已生成,将python 中定义的dict作为参数输入
 import wmf 
test = {'name':'wmf'}
result = wmf.reverse(test)
print(result)

返回结果一直是0,未读到对应key值的value,进一步查验返现,test这个dict就没有传进去,传入参数是NULL。求助定义的问题,还是调用的问题?如何解决

0

1个回答

c语言没法直接接收python的对象,你不妨将dict先序列化,得到一个字符串,比如类似
[{"a":1},{"b":2}...]这样的,然后传给c语言的函数处理。

0
weixin_42486445
内拉祖里0420 python.h里的 pyobject应该就是 直接接收python里的数据,在c中读取处理的啊;而且如果dict都转成字符串了,就没有key不key一说了啊,那PyArg_ParseTupleAndKeywords这是函数还有啥存在的意义?
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言数组作为参数传入子函数
对不起,可能我没表达清楚,我想问,数组作为参数传入子函数为什么不是作为形式参数传入,请你看程序运行结果,如果数组作为形式参数传入子函数,那么形式参数的值并不会影响原来main函数中的值,但是实际上,main函数中数组原来的值已经被修改了,这是因为数组传入的是地址(指针),我的问题就在这里,传入的是指针为什么不是用完就扔的形式参数。rnrn这与c语言的设计有关是吗?内部有什么机制吗?
[Python函数] 函数作为参数传入
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。 def add(x, y, f): return f(x) + f(y) print(add(-5,6,abs))
c++中数组作为参数传入函数
前言:最近再看一个用c++写数组求逆矩阵的程序,那是相当的繁琐,但是很有趣。其中涉及了大量的数组运算,所以数组作为参数传入函数很重要,这里记录一下。 一维数组作为参数 1.我们除了要将数组名传入函数外,为了规范化,我们还要将数组的大小也要作为参数传入,而不是在函数内部去定义大小。即下面这种形式: int sum_arr (int att[] , int size) 2.我们学习c的时候知道数组...
Python,如何将元组中的元素作为参数传入函数
本文由Markdown语法编辑器编辑完成。 1. 需求: 现在有一个需求需要实现: 2. 函数实现: https://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments
python随笔——将函数作为参数传入函数
①测试一个样例: # 测试函数作为参数 def fun1(fun): print("---------------------") fun() print("---------------------") def fun2(): print("!!!!!!!!!!!!!!!!!!!!!") fun1(fun2) 运行结果如下: -----------...
Python中将函数作为另一个函数的参数传入并调用
Python中将函数作为另一个函数的参数传入并调用 将函数作为另外一个函数的参数调用?听起来很复杂,其实动起手来很简单。下面跟我一起看看一些简单的例子,我尽量简单易懂: 下面这段代码涵盖了函数调用的函数的传参和不传参的两个方面: def func_a(func_a_arg_a, func, **kwargs): print(fun...
Python技巧----函数作为参数以及dict代替if
这是tkinter的代码,command参数表示按钮对应的动作,这个参数是个函数 # 操作符按钮 self.btn_add = tk.Button(self.tkwindow, text='+', command=self.command_add) self.btn_add.pack(padx=1, side='left') self.btn_minus = tk.Button(s...
C语言二维数组作为函数的参数
void func(?????) 1.array作为指针变量,指向3个int型的数组 void print(int (*array)[3] ) 2.作为指针数组,这个数组包含3个int变量 void func(int *array[][3]) 2.二级指针 void func(int(**array)) 1. #include #include
指针作为参数传入函数的陷阱
下面以一个例子来引出这种错误:#include <iostream> using namespace std; #include <stdlib.h> #include <string.h> void func(int *p) { p = (int *)malloc(sizeof(int) * 10); memset(p, 0, sizeof(p)); p[0] = 1; }
C++传入任意的函数类型作为参数
C++编程中,有些时候需要传入函数作为参数,这在STL中作为谓词经常用到。传入的可以是函数、函数对象和lambda表达式。编程的时候,把它当成一个模板类型传入即可。以下给出一个简单的例子: #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;utility&amp;amp;gt; #include &amp;amp;lt;functional&amp;amp;gt; template&amp;amp;lt;typename F&am
传入指针作为参数的函数的小问题
我们看下面的代码 #include&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; using namespace std; void swap(int* a,int*b) { int* temp; temp=a; a=b; b=temp; } int main() { int a,b; a=7; b=1; int* p; int* q; p=&amp;
枚举类型怎么作为函数的参数传入?
例如:rnenum colorred,black,blue;rnrnfunc(color)rnrn调用的时候: func(red);rn这样传出错。应该怎么做?rnrnrn
结构体作为参数传入函数错误
结构体作为参数传递的错误! 如下代码:定义了一个结构体变量,将该结构体变量作为参数传递给函数func2,此时传递给函数func2的是结构体变量my_sis的拷贝,函数func2中对所传入的结构体的修改不影响main函数中定义的结构体,所修改的只是传入的拷贝的副本。 1 #include 2 3 struct score 4 { 5 int math;
python 将列表作为参数传入函数时的测试与理解
python 将列表作为参数传入函数时的测试与理解 将一个列表传入函数后,会对这个列表本身产生什么改变? 这就是本文主要考察的内容。 list = [1,2,3,4,5,6,7] word = list.pop(0) print(word) print(list) # 输出结果理所当然地为: # 1 # [2, 3, 4, 5, 6, 7] # def a(temp): b = temp....
【Java的数组作为参数传入方法和C语言的不同】
闲话少说,直接上代码:rnint arr[10];rnfor(int i=0;i<10;++i)rn arr[i]=0;rnrnrnrn[code=java]rnvoid foo(int[] arr)rnarr[0]=100;rnrn[/code]rn以上这段代码,在方法弹栈后,对于传入的数组参数是没有任何修改的!!但是C语言,这样:rn[code=c]rnfoo(int a[])rnarr[0]=100;rnrn[/code]rnC语言,数组和指针是一回事情!int a[] <=> int *a !!rn所以调用过后,arr[0]的值的确是改变了,因为指针拿到了地址。rnrn问题是:java中为什么不像C一样可以利用把数组传入函数(方法)的手段改变被传入数组相应元素的值;不是说java中数组的名字也是数组元素的「管理者」吗,比如:rn[code=java]rnint array1[5]=new int[]1,2,3,4,5,;rnint[] array2=array;rnarray2[0]=1000;rnSystem.out.println("array1[0] = "+array1[0]); //output: 1000rn[/code]rn既然说数组之间的名字传递表示的所有关系的传递,那么为什么(我们回到第一个代码)那个foo()方法在结束后就不能改变原来的老数组的元素值,但是C就可以呢??rn不同点在哪里??
C语言中将路径作为参数传入命令行的问题。
C语言中将路径作为参数传入命令行的问题。rnrn就是我获取了一个文件的路径(E:\141\Fedit22.dat,或是任何文件路径),需要把这个路径字符串传入system()函数调用控制台程序,但因为“\”是转义字符,所以程序就无法识别,如何才能正确传入呢?有没有什么api函数之类的?rnrn例如下边:rnchar *pParam3="E:\141\Fedit22.dat";rnchar aCmdBuf[128];rnsprintf(aCmdBuf, "%s %s %s %s", pCmd, pParam1,pParam2,pParam3);rnsystem(aCmdBuf);rnrn就是pParam3这个参数传入后原来的字符串会变成这样的:E:aFedit22.dat,棘手啊,期待高手帮助,我正在准备自己的毕业设计(学光电的所以比较菜,谢谢了)。
C语言的参数中的函数?
void InOrderTraverse_Thr(BiThrTree T,void(*Visit)(TElemType e))rnvoid(*Visit)(TElemType e)看起来是个函数,在InOrderTraverse_Thr函数体内也是当作函数用的Visit(p->data);rn请问第二个参数void(*Visit)(TElemType e)是什么意思,有什么作用?
python把函数作为参数
在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数f的值: add(-5, 9, abs) 根据函数的定义,函数执行的代码实际上是: abs(-5) + abs(9) 由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值。
C语言--数组作为参数
例子: void fun(char a[10]){ char c = a[3]; } int main(void){ char b[100]="abcdef"; fun(b); return 0; } 这样运行没有问题!!!! 原因:这里边fun函数的形参是数组char a[10],实际传递的数组大小与函数形参指定的数组大小没有关系,因为这样一条规则: C语言中,当一维数组作
关于Python中函数作为参数的问题
最近在看关于Python关于图像处理方面的内容,我用的是PIL库(Python Image Library)。rn在做灰度变换时,我用了Image类的eval函数,这个函数要求传入一个Image对象和一个function,其中function要带一个参数,eval可以将这个function用于计算所有的像素点。现在问题来了,比如我要做一个对数变换,用一个s = c * math.log(1 + r, base)这样的函数(其中r代表灰度值),我必须在函数内部定义好c和base的值,再把函数传递给eval才能正确运行。rn如果我想将这个函数定义为带3个参数,第一个用于像素点操作,其它两个用于控制c和base,我该怎么进行传递?(我尝试了用foo(p,c=1,base=10)这样的传递方式,但输入后shell报错)希望各位牛人能帮帮我啊!!
python 里的dict问题
有4列数:rnaaa;1;2rnaaa;1;3rnbbb;4;5rnaaa;2;2rnaaa;2;5rnaaa;2;5rn。。。后面还很多rn怎么得出第1列和第2列相同的(第3列-第2列)的最大值,比如上面结果应该为:rnaaa;1;2 (3-1)#括号不显示rnbbb;4;1 (5-4)rnaaa;2;3 (5-2)rn求教,谢谢
C语言函数的参数
一、函数的参数可以是变量、变量指针和变量引用: void funcA(int8_t x) { x=x+1; } 代码说明:该函数的参数属于值传递,在调用该函数时,仅仅只是把实参的值拷贝了一份赋值给了形参x,之后的任何操作都不会影响到实参的值。 int8_t funcB(int8_t* x) { (*x)+=1; return (*x); } 代码说明:该函数的...
C语言函数与参数
函数的参数是从右向左进行处理的 实参的处理方法是:将实参表达式入系统堆栈 形参变量空间,实际上是实参表达式入栈之后所用的系统堆栈空间 实参入栈之上有8字节,其中4字节为函数返回值,4字节为原函数系统堆栈栈底指针 函数的局部变量事实上使用的是系统堆栈空间 ...
python 里的dict的问题
有4列数:rna;aaa;1;1rnb;aaa;1;2rna;bbb;4;5rna;aaa;2;5rna;aaa;2;5rnb;aaa;2;5rn。。。后面还很多rn怎么把第1列相同的数中的第2列相同的第3列求和,比如上面结果应该为:rna;aaa;5(1+2+2)#括号不显示rna;bbb;4rnb;aaa;3rn求教,谢谢
关于ibatis如何传入数组作为参数
转载:感谢 涂剑凯http://blog.sina.com.cn/bdstjk   一:传入参数仅有数组        &amp;lt;select id=&quot;GetEmailList_Test&quot;  resultClass=&quot;EmailInfo_&quot;&amp;gt;            select *            from MailInfo with (nolock)            w...
如何把HASH表作为参数传入存储过程??
如何把HASH表作为参数传入存储过程??
如何将数据类型作为参数传入
如果编写一个类或函数,其中某一数据类型不确定,该如何解决。
如何把二维数组的一行作为参数传入一个函数?
如何把二维数组的一行作为参数传入一个函数?rnrn如rn[code=C#]rnvoid A(byte []P)rnrnrnbyte [,]myArray = new byte[16,8];rnrn[/code]rnrn然后把myArray 的每一行,传到函数A中,rnrnrnC++中,或以用MyArray[i]表示该数据的一行,C#用什么方法呢?
表变量作为参数传入sp_executesql ?
create proc [dbo].[test_execsql]rnasrndeclare @a tablern(a int,rnb varchar(10))rndeclare @nsqlstr nvarchar(1000)rnset @nsqlstr='rninsert into @a values(1,''jkl'')'rnexec sql_executesql @nsqlstr,N'@a table (a int,b varchar(10))',@arnrnrn错误提示:rnrnMust declare the scalar variable "@a".rnrn请问:rn怎末传入这个表变量rn不要直接在字符串nsqlstr里声明这个表变量。
如何将控件作为参数传入
想在多线程中传入控件做为参数,可是不知道怎么个用法...郁闷rnrn
so动态库相互调用问题?
在主程序main里面调用so1没问题,但在so2里面调用so1时,dlopen没问题,但dlsym就直接报Segmentation fault后退出。rnmain和so2调用so1的方法完全一样。请问什么原因?与makefile文件有关系吗?谢谢!rnrnrnrn
请问怎么把当前窗体作为参数传入函数中
如题,怎么做?rn我定义了这个函数rnPublic Function SetupWindowByDefalult(theform As Form)rn'设置窗体为无边框模式rntheform.BorderStyle = 0rn'设置窗体的宽度,长度单位为像素rntheform.ScaleMode = 3rn'设置窗体的默认显示位置为屏幕中间rntheform.StartUpPosition = 2rn'设置窗体的宽度和高度rntheform.ScaleWidth = 554rntheform.ScaleHeight = 25rntheform.BackColor = RGB(251, 231, 211)rnEnd Functionrnrn调用的时候:rnPrivate Sub Form_Load()rnSetupWindowByDefalult (Me)rnEnd Subrnrn老是提示错误,看了me的类型不是form,而是窗体的名称,请问怎么实现将窗体作为参数传入函数呢?
setTimeout如果中调用的函数如果传入对象作为参数?
必有有一个函数 rnfoo(x) x是指向一个对象,比如document.form1rnrn setTimeout("poo(x)",1000)rnrnrn这里poo需要x作为参数,上面的代码不能运行,改成setTimeout("poo("+x+")",1000)也不能运行,请问如果做到呢??
python把函数作为参数的函数
参考 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000map() 可以理解为一种映射 map(func, sequence) 入参是函数和序列 返回一个列表,这个列表是序列的每
xml在web项目中作为传入传出参数
/** * */ package util; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileWriter; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.u...
C语言函数如何作为参数传递
在学习数据结构链表中,其中有一个LocalElem();函数rn其中传递的函数是compare();rn当然函数compare是抽象的,具体的可以是相等什么的rn我根据理解,写下函数的声明rn[code=C/C++]rnint LocalElem(compare(),*e);rn用e来存储第一个满足compare()的函数rn[/code]rn希望大家给我个例子,再加些理论,谢谢。非常感谢
Js中arguments的使用、函数自调用、变量作用域、函数作为参数传入、函数作为返回值
1,arguments是一个比较特别的对象,每个函数中都有一个arguments,它接收函数传入的参数,以数组的形式存放在 arguments,可遍历 //1,需求:求任意数的最大值 function getMax(){ var Max = arguments[0]; //arguments接收传进来的参数,通过下标可以索引 for (i = 1;i&amp;lt...
go语言与c语言的相互调用
最近由于工作原因,需要实现go语言与c语言的相互调用。由于go语言与c语言有着千丝万缕的暧昧关系,两者之间的调用可以通过语言层面实现。下文是对此的总结。 go语言调用c语言 以下为一个简短的例子: package main // #include &lt;stdio.h&gt; // #include &lt;stdlib.h&gt; ...
C语言与C++语言相互调用
                                                                                     C语言与C++语言相互调用 1 C++调用C中的函数   1.1 C++调用C中的函数(正确使用)   1、案例源文件组成                                              ...
PYTHON和C的相互调用
python库和C语言是相互对应的,两者可以相互调用 PYTHON调用C/C++ PYTHON调用C cftest.c int cf_test() { printf(&amp;quot;hello python!\n&amp;quot;); return 0; } cfcall.py import ctypes lib = ctypes.cdll.LoadLibrary cflib = lib(&amp;quot;./libcftest.so...