【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这是函数还有啥存在的意义?
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python 字典怎样当作参数传入函数里,以及在函数里的一些遍历。变量的作用域。
字典当作参数以后的一些用法: dic={'abc':123,'aaa':333,'wer':334} def text_dic(**dd): for a,b in dd.items():# a 代表键 ,b代表值 print(a,b) text_dic(**dic) #输出字典中的键: def text_dic(**dd):      for key
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...
python 中参数传递 * 和 ** 的问题,以 tuple和dict方式传递参数
在python中,有时会看到这样的函数定义:    def   p1(*arg1,**arg2):          pass也有看到这样的函数调用:    i=5    function(*i)这些都是什么意思呢?1.传入的参数生成 tuple 和 dict      def    p1(*a1,**a2):             print a1,/n,a2       p
python的五种参数 之 通过一个tuple和dict调用含有多个参数的函数
1、首先需要理解什么是位置参数(必选参数)、默认参数、可变参数、关键字参数、命名关键字参数-----(简述) 位置参数:按照函数规定的位置,填入参数。 def a1(x1,x2,x3): print(x1,x2,x3) a1(1,2,3) a1(3,2,1) 输出结果: 1 2 3 3 2 1 默认参数:若不指定参数,会有提前定义好的参数代替(默认参数必须指向不变对象!否则你的...
python之字典和函数参数
python基础之字典和函数参数
数据结构中链表作为函数参数进行传递
最近在学数据结构,线性结构中链表又是最常用的,于是就开始对链表的一些基本操作开始自己实现。 InitList、InsertList、deletelist、destroylist、GetElemList、locateList、etc。我是建立一个带头节点链表,头指针作为函数参数进行链表传递,例如States InitList(Node *L){ L = (Node *)molloc( sizeof
python list列表dict字典引用传递
python 中的list和dict是当其作为参数进行传递的时候,是引用传递。 何谓引用传递? 就是函数内部对list和dict参数的修改和删除操作会影响到实参。以列表举例说明如下: 定义一个函数,用于更新列表。 定义一个列表,作为函数参数调用更新函数。 最后输出列表。def update_list(list_one): list_a.append('a')list_a = [2,
ctypes 加载的so库中函数参数的字符串传递问题(str与bytes转换)
在项目开发过程中,需要python使用ctypes 加载编译好的so库,然后调用so库的函数,python传入str参数,但是按通常python传入字符串参数的方法(func(“test”))时,so库中的函数不能接收到全部的字符串,而是只能接受第一个字符,这样显然不能达到调用的目的。 如何才能让完整的字符串传入到so库中的函数中呢?那就需要把str类型的参数转换成bytes类型才能够传入。
python调用c语言的动态链接库时传递字符串参数的问题
最近在用python调用科大讯飞的接口进行语音识别工作,大概的过程是:用python加载科大讯飞提供的动态链接库,然后用这个动态链接库来进行语音识别。全部代码就不给出来了,这只给出困扰我的部分。 from ctypes import cdll cur = cdll.LoadLibrary('libmsc.so') MSPLogin = cur.MSPLogin ret = MSPLogin...
【转】当用 Python ctypes 模块调用动态链接库,如何传入一个结构体指针
转自http://www.dup2.org/node/150 当用 Python ctypes 模块调用动态链接库,如何传入一个结构体指针 、 由 qyb 于 星期五, 2006-04-07 07:40 发表 技术 最近用 dv2xvid 这个东东很多,上两周几乎每天都用它跑一个晚上压缩2个小时的视频。于是又萌发了把它改进得更通用的念头。 目前 dv2xvid...
C语言中将二维数组作为参数传递给函数的方法
原文:http://guoyiqi.iteye.com/blog/1626922 二维数组的函数参数传递的问题,以前解决过好几次,总还是忘记,这回总结出来写在这里。   #include /*********************************  * 方法1: 第一维的长度可以不指定 *  *                但必须指定第二维
C语言指针作为函数参数传递学习(一)
1. 数组或者一维指针做函数形参 1.1传入的指针为NULL 比如下面的例子,很多人都会理解错: #include <stdio.h> void test(char *string) { string = "hello world"; } int main() { char *str = NULL; test(str); printf("str=%s\n",str); ...
c语言,函数作为传入参数传入另一个函数,,在传入的时候要写成指针形式,主函数再调用的时候不需要再写成指针形式,,,二分法求方程的根
#include<stdio.h> double f(double x) {     return 2 * x * x * x - 4 * x * x + 3 * x - 6; } double real_root(double (*fun)(double), double left, double right, double deviation) {     double x, ...
结构体数组作为函数参数
把结构体数组名作为函数的一个参数,然后在这个函数的函数里面继续作为参数,把一个值赋给这个结构体数组的一个变量,我再赋值的地方是有值的,在函数里面也是有值的,但是出了这个函数回到主函数时,这个结构体数组的变量的值就为空了。为什么呢?因为我在使用这个函数是这样的, iReturn = ParseAllEitSection(&stTransportParameter,pfTsFile,iTsP...
C语言中将二维数组作为函数参数来传递
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一, 形参给出第二维的长度。例如:#include <stdio.h>void func(int n, char  str[ ][5] ){ int i; for(i = 0; i < n; i++)  printf("/nstr[%d] = %s/n", i, str[i]);}void main(){ cha...
菜鸟学习-C语言函数参数传递详解-结构体与数组
C语言中结构体作为函数参数,有两种方式:传值和传址。 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响。 例子: typedef struct tagSTUDENT{ char name[20]; int age; }
Python与C参数交互---结构体指针作为参数 实例
在Python中某些时候需要C做效率上的补充. 在实际应用中,需要做部分数据的交互. Python 可以通用 ctypes 模块很好地调用C. 下面演示了 Python 中调用C一个标准函数. 传递一个结构指针入. 得到C中分配内存数据 传递出. 希望对你的Python 学习有所帮助. 1 test.c #include #include typedef struct
python随笔——将函数作为参数传入函数
①测试一个样例: # 测试函数作为参数 def fun1(fun): print("---------------------") fun() print("---------------------") def fun2(): print("!!!!!!!!!!!!!!!!!!!!!") fun1(fun2) 运行结果如下: -----------...
python参数传递:对象的引用
python参数传递:对象的引用         大家都知道在python中,一切皆对象,变量也不再具有类型,变量仅仅是对象的一个引用,我们通常用变量来测类型,通常测得就是被这个变量引用得对象的类型。 例如: 这里的类型就是123这个对象的类型。变量的作用就相当于c中的指针,指向特定的内存空间
c语言中,二维数组作为形参在函数之间的传递
以前经常在函数中传递一维数组或指针。今天,由于工作需要,需要将一个二维数组通过函数来进行传入,原本以为在函数接口处定义一个指向指针的指针就可以了,但是,在编译过程中发现怎么也编译不通过。经过调整,得出以下方式,仅供参考。 (1)、二维数组参数传入,通过下面的函数打印所有的二维数组中所有的值。 #include "stdio.h" #define LIE 3 int array[][LIE]
C语言指针初始化与NULL时作为实参传入函数中出现的问题
先看一段代码:void function(int * exp) { ............. } int main(int argc ,char * argv[]) { int *tmp = NULL; function(tmp); ......... return 0; } 笔者测试过,无论在function中怎么最tmp进行操作,都不会...
python函数传递list,tuple和dict时的复制关系
一直对python函数中的参数关系
C语言数组元素地址作为函数参数
今天首先来做一个题,值得借鉴。#include<stdio.h> void fun(int *p){ printf("%d",p[5]);//打印第六个元素,但是地址传入的第四个元素, getchar(); } void main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; fun(&a[3]); //把数组的第4个元素的地址传
C/C++中作为函数参数的 i++ 与 ++i
C/C++中作为函数参数的 i++ 与 ++i平时写代码时,经常会遇到自加自减运算,我们知道这种自加自减运算有两种形式,一种就是我们所谓的前置++(或- -)(例如:++i),另一种是后置++(或- -)(例如: i++)。那么这两者的区别是什么呢? 为简单起见,我们以 i++ 和++i 为例,说明两者的区别: i++ 是先取 i 的值,再进行自加运算;而++i是先做自加运算,再取 i 的值。我们
初学C-结构体和结构体数组作为函数的参数
2018年5月25日17:49:52*结构体变量作函数参数时,函数内的操作不会改变结构体的值,结构体的各成员作为实参传递给了函数的形参,实际操作的是形参,不会影响实参;*结构体数组作为函数参数时,实际上是将结构体数组的第一个数组成员的地址传递给了形参,用对应的指针或者直接用结构体数组的名称作为实参效果是一样的,操作都直接对结构体数组进行,可以改变其值下面程序中aver(stu+i)中的stu+i的...
C语言中结构体参数变量的传递
【文章摘要】       在C语言中,结构体参数变量经常作为函数的参数来进行传递。但如果参数设置不当,会出现内存问题。       本文以实际的程序代码为例,详细地介绍如何正确地使用结构体参数变量,为相关的开发工作提供了参考。【关键词】       C语言  结构体  函数  参数  传递 一、前言       本文中的程序实现对员工信息结构体字段赋值并打印出来的功能。该结构体的定义如下:// 员
python里函数怎么样使用元组或字典作为参数调用
在原来python2里有一个函数apply来做这种事情,如下:# File: builtin-apply-example-1.py def function(a, b): print a, b apply(function, ("whither", "canada?")) apply(function, (1, 2 + 3))# File: builtin-apply-example-
c语言一维数组做参数传递给函数:
今天碰到了一维数组做函数参数的问题,那就扒一扒这个问题: 首先抛结论: 1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针。 2:实际传递的数组大小与函数形参指定的数组大小没有关系。 然后举例说明: 下面是一个元素交换函数,把数组array【i】和array【j】交换位置。注意看数组是怎么传递给函数的。 正确的写法1: 解释说明:编译器把
C语言 将函数(有参、无参)作为参数传递
在学习中遇到一个问题,就是要计算出一个函数的执行时间,但是我不可能每个函数都去执行一次clock,所以这里要想统一处理这个问题就需要把函数作为参数传入到方法内。 首先是是无参函数作为的传递: void printTest_0() { printf(&quot;%s&quot;, &quot;printTest_0&quot;); } void printTest_1() { printf(&quot;%s&quot;, &quot;printTest_1...
【python C结构体】Python Ctypes结构体指针处理(函数参数,函数返回)
一切以官网为准:https://docs.python.org/3.6/library/ctypes.html 以下为参考: 1、在python中调用C语言生成的动态库,返回结构体指针,并进行输出! mylib.c(动态库源代码) // 编译生成动态库: gcc -g -fPIC -shared -o libtest.so test.c      ...
C语言 enum作为函数返回值及函数参数
1.作为返回值 作为函数参数 https://bbs.csdn.net/topics/340095770
c语言结构体成员作为函数参数
#include #include struct Worker{ char name[10]; char num[8]; }; void Sort(struct Worker wk[]){ //排序函数 struct Worker temp; for(int i=0;i<5;i++){ int k = i; for(int j=i+1;j<5;j++){ if(
实现向 python 脚本中传递列表,字典参数
script.py from optparse import OptionParser def main():     '''     参数:ip:list           user:string           password:string           playbook:playbook路径或模块名,string           result_file:st
Python 列表&字典作为函数的参数
这篇笔记主要记录,列表作为函数参数传递时的深浅拷贝问题 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' 这篇笔记主要记录,列表作为函数参数传递时的深浅拷贝问题 ''' import copy def list_append(l=[]): l.append([0,0,0]) def list_obj_append(l=[]): ...
C语言技巧:怎样把数组作为参数传递给函数?
来源:http://see.xidian.edu.cn/cpp/html/1595.html?bsh_bid=336528277   在把数组作为参数传递给函数时,有值传递(by value)和地址传递(by reference)两种方式。在值传递方式中,在说明和定义函数时,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。例如,在下例中数组x[]是通
C语言关于结构体做参数传递
水平有限,谈谈自己的看法 首先结构体
C语言经典例题--结构体指针变量作为函数参数的传递
#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; struct student { int age; char sex; char name[30]; }; void inputstudent(struct student *ps)//对结构体变量输入时必须传地址 { (*ps).age = 10; strcpy(ps-&amp;gt;n...
python_9(获取字典值、函数参数、函数返回值、lambda的函数用法)
如果我们需要获取字典值的话,我们有两种方法,一个是通过dict[‘key’],另外一个就是dict.get()方法#获取字典值 info = {'1':'first','2':'second','3':'third'} number = raw_input('input type you number:') print info.get(number,'error')#实例1 #!/usr/bin/
把tuple或者list里的元素作为函数参数传入
1、tuple或list中的所有元素传入一个函数的参数列表中: 需求函数如下: tuple = (1, &quot;foo&quot;, &quot;bar&quot;) def myfun(number, str1, str2): return (number * 2, str1 + str2, str2 + str1) myfun(expand(tuple)) # (2, &quot;foobar&quot;, &quot;barfoo&quot;) ...
字典作为作为函数不定长参数时候字典的key值不用加引号
参考博客 https://blog.csdn.net/festony/article/details/8247951 def myclass(classname,*classcharacter,**classmate):     sumage = 0     print('班级名称:',classname)     print('班级特色:',*classcharacter)        pr...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 乌班图中如何退出python python如何学习