真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python動(dòng)態(tài)調(diào)用函數(shù),函數(shù)的調(diào)用Python

python類中如何自動(dòng)調(diào)用函數(shù)?

答: 你講的這個(gè)是pyqt里面的內(nèi)容,剛好我最近也一直在學(xué),在代碼當(dāng)中確實(shí)沒有顯式調(diào)用這個(gè)函數(shù),但是你要知道, keyPressEvent是一個(gè)槽函數(shù),在系統(tǒng)內(nèi)部定義了這個(gè)函數(shù),但是里面沒有任何代碼,而你就是對(duì)它重寫了,就是說,只要你的鍵盤里面的任何一個(gè)鍵按下,就相當(dāng)于會(huì)發(fā)送一個(gè)信號(hào),那么在內(nèi)部就會(huì)自動(dòng)調(diào)用這個(gè)函數(shù)。類似的函數(shù)還有 keyReleaseEvent(鍵位松開時(shí)自動(dòng)觸發(fā))等。希望可以幫助到你。

創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元治多做網(wǎng)站,已為上家服務(wù),為治多各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

相關(guān)介紹

python 字典調(diào)用C++函數(shù)

使用Python的ctypes,我們可以直接調(diào)用由C直接編譯出來的函數(shù)。其實(shí)就是調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)。為什么我們需要這樣做呢,因?yàn)橛行r(shí)候,我們可能需要一個(gè)性能上比較講究的算法,有些時(shí)候,我們可以在Python中使用已經(jīng)有了的現(xiàn)成的被封閉在動(dòng)態(tài)鏈接庫中的函數(shù)。下面是如何調(diào)用的示例。

首先,我們用一個(gè)乘法來表示一個(gè)算法功能。下面是C的程序:

int?multiply(int?num1,?int?num2){???

return?num1?*?num2;

}????

如果在Windows下,你可能需要寫成下面這個(gè)樣子:

#include?windows.h?

BOOL?APIENTRYDll

Main(HANDLE?hModule,?DWORD?dwReason,?LPVOID?lpReserved){????

return?TRUE;

}?

__declspec(dllexport)?

intmultiply(int?num1,?int?num2){?

return?num1?*?num2;

}????

然后,自然是把這個(gè)C文件編成動(dòng)態(tài)鏈接庫:

Linux下的編譯:

gcc?-c?-fPIC?libtest.c

gcc?-shared?libtest.o?-o?libtest.so????

Windows下的編譯:

cl?-LD?libtest.c?-libtest.dll????

于是在我們的Python中可以這樣使用:

(其中的libtest.so在Windows下改成libtest.dll即可)

from?ctypes?import?*

import?os

libtest?=?cdll.LoadLibrary(os.getcwd()?+?'/libtest.so')

print?libtest.multiply(2,?2)4????

注意:上面的Python腳本中需要把動(dòng)態(tài)鏈接庫放到當(dāng)前目錄中。

python調(diào)用c函數(shù)

Python是解釋性語言, 底層就是用c實(shí)現(xiàn)的, 所以用python調(diào)用C是很容易的, 下面就總結(jié)一下各種調(diào)用的方法, 給出例子, 所有例子都在ubuntu9.10, python2.6下試過

1. Python 調(diào)用 C (base)

想在python中調(diào)用c函數(shù), 如這兒的fact

#include Python.h

int fact(int n)

{

if (n = 1)

return 1;

else

return n * fact(n - 1);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.c, 編成so庫,

gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

2. Python 調(diào)用 C++ (base)

在python中調(diào)用C++類成員函數(shù), 如下調(diào)用TestFact類中的fact函數(shù),

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

int fact(int n)

{

TestFact t;

return t.fact(n);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

extern "C" //不加會(huì)導(dǎo)致找不到initexample

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.cpp, 編成so庫,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

3. Python 調(diào)用 C++ (Boost.Python)

Boost庫是非常強(qiáng)大的庫, 其中的python庫可以用來封裝c++被python調(diào)用, 功能比較強(qiáng)大, 不但可以封裝函數(shù)還能封裝類, 類成員.

首先在ubuntu下安裝boost.python, apt-get install libboost-python-dev

#include boost/python.hpp

char const* greet()

{

return "hello, world";

}

BOOST_PYTHON_MODULE(hello)

{

using namespace boost::python;

def("greet", greet);

}

把代碼存為hello.cpp, 編譯成so庫

g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1

此處python路徑設(shè)為你的python路徑, 并且必須加-lboost_python-gcc42-mt-1_34_1, 這個(gè)庫名不一定是這個(gè), 去/user/lib查

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import hello

hello.greet()

'hello, world'

4. python 調(diào)用 c++ (ctypes)

ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.

ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

extern "C"

int fact(int n)

{

TestFact t;

return t.fact(n);

}

將代碼存為wrapper.cpp不用寫python接口封裝, 直接編譯成so庫,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

進(jìn)入python, 可以如下使用

import ctypes

pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')

pdll.fact(4)

12


當(dāng)前題目:python動(dòng)態(tài)調(diào)用函數(shù),函數(shù)的調(diào)用Python
文章分享:http://weahome.cn/article/dscjdgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部