python C相互呼叫python裡的dict如何作為引數傳入 so中的c語言函式

2021-03-22 02:14:05 字數 6076 閱讀 9790

1樓:孟羽然

#include

#include

#include

static pyobject *

wmf_reverse(pyobject *self, pyobject *args, pyobject *kwargs) ;

char *name = null;

pyobject *retval = null;

// 問題1: 只取一個字串,format應該是"s"

// >>>

return retval;

} static pymethoddef

wmf_methods = ,

// 問題3:方法定義表,應該用一條空記錄來表示結束。,};

// 問題4:沒有定義module

static struct pymoduledefwmf_module = ;

// 問題5:入口函式要宣告為:pymodinit_funcpymodinit_func

pyinit_wmf(void)

return m;}

如何將python中的dict作為引數傳入c函式中用c做相關的處理?

python 字典怎樣當作引數傳入函式裡,以及在

2樓:匿名使用者

# -*- coding:utf-8 -*-#py3

'''python 字典當作函式引數,及遍歷'''def f(di):  //定義函式for key in di:     //兩種方式遍歷字典print(key,':

',di[key])for key,value in di.items():

print(key,'-',value)

dic=

f(dic)

python呼叫c語言動態庫dll/.so中的函式的引數是結構體的問題

python 如何在一個函式裡通過傳引數呼叫其他函式

3樓:匿名使用者

1.method大小寫修改到一致。

2.最後那裡bb不要加引號。

def aa(method, data):

method(data)

def bb(data):

print data

def cc(data):

print data

aa(bb,'123')

4樓:韌勁

python中函式引數的傳遞是通過「賦值」來傳遞的。但這條規則只回答了函式引數傳遞的「戰略問題」,並沒有回答「戰術問題」,也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。

而後者又是由前者決定的。函式引數的定義有四種形式:

1. f(arg1,arg2,...)

2. f(arg2=,arg3=...)

3. f(*arg1)

4. f(**arg1)

第1 種方式是最「傳統」的方式:一個函式可以定義不限個數引數,引數(形式引數)放在跟在函式名後面的小括號中,各個引數之間以逗號隔開。用這種方式定義的函式在呼叫的時候也必須在函式名後的小括號中提供相等個數的值(實際引數),不能多也不能少,而且順序還必須相同。

也就是說形參和實參的個數必須一致,而且想給形參1的值必須是實參中的第一位,形參與實參之間是一一對應的關係,即「形參1=實參1 形參2=實參2...」。很明顯這是一種非常不靈活的形式。

比如:"def addon(x,y): return x + y",這裡定義的函式addon,可以用addon(1,2)的形式呼叫,意味著形參x將取值1,主將取值2。

addon(1,2,3)和addon (1)都是錯誤的形式。

第2種方式比第1種方式,在定義的時候已經給各個形參定義了預設值。因此,在呼叫這種函式時,如果沒有給對應的形式引數傳遞實參,那麼這個形參就將使用預設值。比如:

「def addon(x=3,y=5): return x + y」,那麼addon(6,5)的呼叫形式表示形參x取值6,y取值5。此外,addon(7)這個形式也是可以的,表示形參x取值7,y取預設值5。

這時候會出現一個問題,如果想讓x取預設值,用實參給y賦值怎麼辦?前面兩種呼叫形式明顯就不行了,這時就要用到python中函式呼叫方法的另一大絕招 ──關健字賦值法。可以用addon(y=6),這時表示x取預設值3,而y取值6。

這種方式通過指定形式引數可以實現可以對形式引數進行「精確攻擊」,一個副帶的功能是可以不必遵守形式引數的前後順序,比如:addon(y=4,x=6),這也是可以的。這種通過形式引數進行定點賦值的方式對於用第1種方式定義的函式也是適用的。

上面兩種方式定義的形式引數的個數都是固定的,比如定義函式的時候如果定義了5個形參,那麼在呼叫的時候最多也只能給它傳遞5個實參。但是在實際程式設計中並不能總是確定一個函式會有多少個引數。第3種方式就是用來應對這種情況的。

它以一個*加上形參名的方式表示,這個函式實際引數是不一定的,可以是零個,也可以是n個。不管是多少個,在函式內部都被存放在以形參名為識別符號的tuple中。比如:

對這個函式的呼叫addon() addon(2) addon(3,4,5,6)等等都是可以的。

與第3種方式類似,形參名前面加了兩個*表示,引數在函式內部將被存放在以形式名為識別符號的dictionary中。這時候呼叫函式必須採用key1=value1、key2=value2...的形式。

比如:1. def addon(**arg):

2. sum = 0

3. if len(arg) == 0: return 0

4. else:

5. for x in arg.itervalues():

6. sum += x

7. return sum

那麼對這個函式的呼叫可以用addon()或諸如addon(x=4,y=5,k=6)等的方式呼叫。

上面說了四種函式形式定義的方式以及他們的呼叫方式,是分開說的,其實這四種方式可以組合在一起形成複雜多樣的形參定義形式。在定義或呼叫這種函式時,要遵循以下規則:

1. arg=必須在arg後

2. *arg必須在arg=後

3. **arg必須在*arg後

在函式呼叫過程中,形參賦值的過程是這樣的:

首先按順序把「arg」這種形式的實參給對應的形參

第二,把「arg=」這種形式的實參賦值給形式

第三,把多出來的「arg」這種形式的實參組成一個tuple給帶一個星號的形參

第四,把多出來的「key=value」這種形式的實參轉為一個dictionary給帶兩個星號的形參。

例子:1. def test(x,y=5,*a,**b):

2. print x,y,a,b

就這麼一個簡單函式,來看看下面對這個函式呼叫會產生什麼結果:

test(1) ===> 1 5 () {}

test(1,2) ===> 1 2 () {}

test(1,2,3) ===> 1 2 (3,) {}

test(1,2,3,4) ===> 1 2 (3,4)

test(x=1) ===> 1 5 () {}

test(x=1,y=1) ===> 1 1 () {}

test(x=1,y=1,a=1) ===> 1 1 ()

test(x=1,y=1,a=1,b=1) ===> 1 1 ()

test(1,y=1) ===> 1 1 () {}

test(1,2,y=1) ===> 出錯,說y給賦了多個值

test(1,2,3,4,a=1) ===> 1 2 (3,4)

test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4)

怎麼在python呼叫c函式的時候實現指標引數

5樓:ar科技團隊糯米

python寫程式原則是所有進來的字串(讀檔案,爬網頁),一進來就decode,處理完之後在要輸出的地方在encode。題主讀入(read)和輸出(print)在一行裡,要在win下面想不出錯就這麼寫 print response.decode('utf-8').

encode('gbk')

python 如何把dict裡的資料按照a='x'的形式傳給一個方法 10

6樓:日time寸

解包裹可以實現這一功能。解包裹在傳遞字典dict時,讓字典的每個鍵值對作為一個關鍵字傳遞給func。為了提醒python,引數dict是包裹關鍵字傳遞所用的字典,在dict前加**。

def func(a,b,c):

print a,b,c

dict =

func(**dict)

與字典解包裹類似,元組也可以解包裹。就是在傳遞tuple時,讓tuple的每一個元素對應一個位置引數。在呼叫func時使用*,是為了提醒python:

我想要把args拆成分散的三個元素,分別傳遞給a,b,c。

args = (1,3,4)

func(*args)

7樓:匿名使用者

python的函式可以直接這樣定義

def func(**dict)

但是好像和你的是反的,他是傳入key-value對,進去就成字典了.

你這個好像基本不可能,因為引數變數名本身不能是變數引用,放個字串變數引用在哪兒,會報錯。

8樓:匿名使用者

可以參考python中的「關鍵字引數「。關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict.

def test(**kw):

print kw

>>>kw=

>>>test(a=kw['a'],b=kw['b'])

9樓:匿名使用者

>>> def test(dict,*arg):

for value in arg:

print dict[value]

>>> test(dict,'a','b')12你要的是不是這個效果?

10樓:匿名使用者

def test(dict):

for i in dict.values():

print i

dict=

test(dict)

你是想要這樣的效果嗎?

python 怎麼呼叫c語言介面

11樓:優就業張老師

ctypes:  可直接呼叫c語言動態連結庫。

使用步驟:

1> 編譯好自己的動態連線庫

2> 利用ctypes載入動態連線庫

3> 用ctype呼叫c函式介面時,需要將python變數型別做轉換後才能作為函式引數,轉換原則見下圖:

4> python若想獲取ctypes呼叫的c函式返回值,需要先指定返回值型別。我們將在接下來的完整sample中看到如何使用。

#step 1:  test.c#include

int add(int a, int b)

#step 2: 編譯動態連結庫 ( 如何編譯動態連結庫在本文不詳解,網上資料一大堆。)gcc -fpic -shared test.c -o libtest.so

#step 3:  test.py

from ctypes import *mylib = cdll("libtest.so")   或者   cdll.loadlibrary("libtest.

so")   add = mylib.add

add.argtypes = [c_int, c_int] # 引數型別,兩個int(c_int是ctypes型別,見上表)

add.restype = c_int # 返回值型別,int (c_int 是ctypes型別,見上表)

sum = add(3, 6)

VS C專案之間的相互呼叫問題編好了專案A,在編專案B時用到專案A,請問怎麼呼叫A

簡單使用兩個gridview,通過不同的資料庫驅動程式連線資料庫,讀取資料。資料分別使用兩種方式錄入。讀取資料 使用odbc讀取資料 private void odbcgetdata 使用 讀取資料 private void mysqlgetdata 錄入資料 錄入資料 使用odbc錄入資料 pro...

python類的函式如何呼叫另類中函式的返回值

可以呼叫,比如下面,mon func被多個函式調版用。權 class myclass def init self pass def func1 self do something self.mon func def func2 self do something self.mon func def ...

python如何根據輸入引數呼叫不同的函式

使用字典,比如下面這樣 def funca pass def funcb pass def func none print cannot find func func dict def func x return func dict.get x,func none 在有switch的語言中,一般都是...