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

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

python找不到c函數(shù) c++找不到對象

python 調(diào)用c函數(shù)里面的函數(shù)嗎

若你是想調(diào)用 c 編寫的DLL,可以使用ctypes調(diào)入使用;

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比尼木網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式尼木網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋尼木地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

#!/usr/bin/python

from?ctypes?import?*

import?os?

#需要使用絕對路徑

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

或在windows下

#!/usr/bin/python

import?ctypes

import?os?

if?os.name?==?'nt':?#?windows系統(tǒng)

_lib_name?=?os.getcwd()?+?'/DemoC.DLL'

dl200_lib?=?ctypes.WinDLL(dl200_lib_name)

python的跨目錄調(diào)用python函數(shù)

可以直接在Emacs中打開Shell然后運(yùn)行Python,也可以安裝ipython模式的插件,后者好一點(diǎn),順便增強(qiáng)了原來的python模式的功能。

python中有cth或coth(雙曲余切)函數(shù)嗎?找不到……

;

到目前為止 Python 都還沒有提供 coth 函數(shù),但其實(shí)它的定義很簡單:

import math

def coth(x):

return math.cosh(x) / math.sinh(x)

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" //不加會導(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, 這個庫名不一定是這個, 去/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

python使用ctypes調(diào)用C編譯dll函數(shù)方法

在函數(shù)聲明加入前綴,如

__declspec(dllexport) int Fun(int a, int b)

否則在加載該dll時(shí)會提示找不到該符號

在windows下可以通過vs自帶的dumpbin工具查看可被調(diào)用符號

dumpbin /exports test.dll

C函數(shù)在調(diào)用過程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時(shí),必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會導(dǎo)致棧破壞,編譯器負(fù)責(zé)具體實(shí)現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定

python下調(diào)用C庫有多種方式,ctypes是其中一種比較方便的,調(diào)用時(shí)首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫

對于簡單的C函數(shù),例如 int add(int a, int b) , 此時(shí)就可以直接調(diào)用了,如

對于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時(shí)對入?yún)⒑统霾妥鲆欢ㄌ幚?,這里分情況討論

以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個較為完整的python類型和C類型的對照,如下:

C中調(diào)用Python函數(shù),找不到模塊

是因?yàn)槟愕哪K的路徑不對,必須先指定路徑

PyObject *sys = PyImport_ImportModule("sys");

PyObject *path = PyObject_GetAttrString(sys, "path");

PyList_Append(path, PyString_FromString("."));


分享名稱:python找不到c函數(shù) c++找不到對象
瀏覽路徑:http://weahome.cn/article/hpdpco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部