python調用so庫
『壹』 python調用動態庫(並且動態庫依賴其它動態庫)
用depends看一下導出了沒有?一般只要標准格式導出就可以使用的。
『貳』 python del如何正確的調用
Python是解釋性語言, 底層就是用c實現的, 所以用python調用C是很容易的, 下面就總結一下各種調用的方法,並給出例子:
1. Python 調用 C (base)
想在python中調用c函數, 如這兒的fact
#include
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_InitMole("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庫的目錄, 進入python, 可以如下使用
import example
example.fact(4)
2. Python 調用 C++ (base)
在python中調用C++類成員函數, 如下調用TestFact類中的fact函數,
#include
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" //不加會導致找不到initexample
void initexample()
{
PyObject* m;
m = Py_InitMole("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庫的目錄, 進入python, 可以如下使用
import example
example.fact(4)
3. Python 調用 C++ (Boost.Python)
Boost庫是非常強大的庫, 其中的python庫可以用來封裝c++被python調用, 功能比較強大, 不但可以封裝函數還能封裝類,
類成員.
http://dev.gameres.com/Program/Abstract/Building%20Hybrid%20Systems%20with%20Boost_Python.CHN.by.JERRY.htm
首先在ubuntu下安裝boost.python, apt-get install libboost-python-dev
#include
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路徑設為你的python路徑, 並且必須加-lboost_python-gcc42-mt-1_34_1, 這個庫名不一定是這個,
去/user/lib查
然後在有此so庫的目錄, 進入python, 可以如下使用
>>> import hello
>>> hello.greet()
'hello, world'
4. python 調用 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.
http://python.net/crew/theller/ctypes/
#include
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
進入python, 可以如下使用
>>> import ctypes
>>> pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')
>>> pdll.fact(4)
『叄』 python如何調用C++外部庫中的類
你好流程比較復雜,需要通過一個c的介面來做。下面是一個簡單的例子,你也可以到booth去看看他們是怎麼用的。
//YourFile.cpp (compiled into a .dll or .so file)
#include
//For std::nothrow
//Either include a header defining your class, or define it here.
extern "C" //Tells the compile to use C-linkage for the next scope.
{
//Note: The interface this linkage region needs to use C only.
void * CreateInstanceOfClass( void )
{
// Note: Inside the function body, I can use C++.
return new(std::nothrow) MyClass;
}
//Thanks Chris.
void DeleteInstanceOfClass (void *ptr)
{
delete(std::nothrow) ptr;
}
int CallMemberTest(void *ptr)
{
// Note: A downside here is the lack of type safety.
// You could always internally(in the C++ library) save a reference to all
// pointers created of type MyClass and verify it is an element in that
//structure.
//
// Per comments with Andre, we should avoid throwing exceptions.
try
{
MyClass * ref = reinterpret_cast
(ptr);
return ref->Test();
}
catch(...)
{
return -1; //assuming -1 is an error condition.
}
}
} //End C linkage scope.
第二步:
gcc -shared -o test.so test.cpp
#creates test.so in your current working directory.
第三步:
>>> from ctypes import cdll
>>> stdc=cdll.LoadLibrary("libc.so.6") # or similar to load c library
>>> stdcpp=cdll.LoadLibrary("libstdc++.so.6") # or similar to load c++ library
>>> myLib=cdll.LoadLibrary("/path/to/test.so")
>>> spam = myLib.CreateInstanceOfClass()
>>> spam
[outputs the pointer address of the element]
>>> value=CallMemberTest(spam)
[does whatever Test does to the spam reference of the object]
『肆』 如何線上部署用python基於dlib寫的人臉識別演算法
python使用dlib進行人臉檢測與人臉關鍵點標記
Dlib簡介:
首先給大家介紹一下Dlib
我使用的版本是dlib-18.17,大家也可以在我這里下載:
之後進入python_examples下使用bat文件進行編譯,編譯需要先安裝libboost-python-dev和cmake
cd to dlib-18.17/python_examples
./compile_dlib_python_mole.bat 123
之後會得到一個dlib.so,復制到dist-packages目錄下即可使用
這里大家也可以直接用我編譯好的.so庫,但是也必須安裝libboost才可以,不然python是不能調用so庫的,下載地址:
將.so復制到dist-packages目錄下
sudo cp dlib.so /usr/local/lib/python2.7/dist-packages/1
最新的dlib18.18好像就沒有這個bat文件了,取而代之的是一個setup文件,那麼安裝起來應該就沒有這么麻煩了,大家可以去直接安裝18.18,也可以直接下載復制我的.so庫,這兩種方法應該都不麻煩~
有時候還會需要下面這兩個庫,建議大家一並安裝一下
9.安裝skimage
sudo apt-get install python-skimage1
10.安裝imtools
sudo easy_install imtools1
Dlib face landmarks Demo
環境配置結束之後,我們首先看一下dlib提供的示常式序
1.人臉檢測
dlib-18.17/python_examples/face_detector.py 源程序:
#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt## This example program shows how to find frontal human faces in an image. In# particular, it shows how you can take a list of images from the command# line and display each on the screen with red boxes overlaid on each human# face.## The examples/faces folder contains some jpg images of people. You can run# this program on them and see the detections by executing the# following command:# ./face_detector.py ../examples/faces/*.jpg## This face detector is made using the now classic Histogram of Oriented# Gradients (HOG) feature combined with a linear classifier, an image# pyramid, and sliding window detection scheme. This type of object detector# is fairly general and capable of detecting many types of semi-rigid objects# in addition to human faces. Therefore, if you are interested in making# your own object detectors then read the train_object_detector.py example# program. ### COMPILING THE DLIB PYTHON INTERFACE# Dlib comes with a compiled python interface for python 2.7 on MS Windows. If# you are using another python version or operating system then you need to# compile the dlib python interface before you can use this file. To do this,# run compile_dlib_python_mole.bat. This should work on any operating# system so long as you have CMake and boost-python installed.# On Ubuntu, this can be done easily by running the command:# sudo apt-get install libboost-python-dev cmake## Also note that this example requires scikit-image which can be installed# via the command:# pip install -U scikit-image# Or downloaded from . import sys
import dlib
from skimage import io
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
print("a");for f in sys.argv[1:]:
print("a");
print("Processing file: {}".format(f))
img = io.imread(f)
# The 1 in the second argument indicates that we should upsample the image
# 1 time. This will make everything bigger and allow us to detect more
# faces.
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets))) for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()# Finally, if you really want to you can ask the detector to tell you the score# for each detection. The score is bigger for more confident detections.# Also, the idx tells you which of the face sub-detectors matched. This can be# used to broadly identify faces in different orientations.if (len(sys.argv[1:]) > 0):
img = io.imread(sys.argv[1])
dets, scores, idx = detector.run(img, 1) for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))5767778798081
我把源代碼精簡了一下,加了一下注釋: face_detector0.1.py
# -*- coding: utf-8 -*-import sys
import dlib
from skimage import io#使用dlib自帶的frontal_face_detector作為我們的特徵提取器detector = dlib.get_frontal_face_detector()#使用dlib提供的圖片窗口win = dlib.image_window()#sys.argv[]是用來獲取命令行參數的,sys.argv[0]表示代碼本身文件路徑,所以參數從1開始向後依次獲取圖片路徑for f in sys.argv[1:]: #輸出目前處理的圖片地址
print("Processing file: {}".format(f)) #使用skimage的io讀取圖片
img = io.imread(f) #使用detector進行人臉檢測 dets為返回的結果
dets = detector(img, 1) #dets的元素個數即為臉的個數
print("Number of faces detected: {}".format(len(dets))) #使用enumerate 函數遍歷序列中的元素以及它們的下標
#下標i即為人臉序號
#left:人臉左邊距離圖片左邊界的距離 ;right:人臉右邊距離圖片左邊界的距離
#top:人臉上邊距離圖片上邊界的距離 ;bottom:人臉下邊距離圖片上邊界的距離
for i, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}"
.format( i, d.left(), d.top(), d.right(), d.bottom())) #也可以獲取比較全面的信息,如獲取人臉與detector的匹配程度
dets, scores, idx = detector.run(img, 1)
for i, d in enumerate(dets):
print("Detection {}, dets{},score: {}, face_type:{}".format( i, d, scores[i], idx[i]))
#繪制圖片(dlib的ui庫可以直接繪制dets)
win.set_image(img)
win.add_overlay(dets) #等待點擊
dlib.hit_enter_to_continue()041424344454647484950
分別測試了一個人臉的和多個人臉的,以下是運行結果:
運行的時候把圖片文件路徑加到後面就好了
python face_detector0.1.py ./data/3.jpg12
一張臉的:
兩張臉的:
這里可以看出側臉與detector的匹配度要比正臉小的很多
2.人臉關鍵點提取
人臉檢測我們使用了dlib自帶的人臉檢測器(detector),關鍵點提取需要一個特徵提取器(predictor),為了構建特徵提取器,預訓練模型必不可少。
除了自行進行訓練外,還可以使用官方提供的一個模型。該模型可從dlib sourceforge庫下載:
arks.dat.bz2
也可以從我的連接下載:
這個庫支持68個關鍵點的提取,一般來說也夠用了,如果需要更多的特徵點就要自己去訓練了。
dlib-18.17/python_examples/face_landmark_detection.py 源程序:
#!/usr/bin/python# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt## This example program shows how to find frontal human faces in an image and# estimate their pose. The pose takes the form of 68 landmarks. These are# points on the face such as the corners of the mouth, along the eyebrows, on# the eyes, and so forth.## This face detector is made using the classic Histogram of Oriented# Gradients (HOG) feature combined with a linear
『伍』 python怎樣嵌入c
用c語言編寫一個動態庫,提供兩個函數,兩個數的整形求和,兩個浮點數的求和。取名為mylib.c。
將c函數文件編譯成so動態庫。運行gcc mylib.c -fPIC -shared -o libtest.so命令,在目錄下可以看到生成的庫文件libtest.so。
Python調用so庫文件。首先導入ctypes,其次用CDLL載入so文件,最後調用對應的函數。將python代碼保存到pydemo.py中。
執行python pydemo.py查看運行結果。
眾多python培訓視頻,盡在python學習網,歡迎在線學習!
『陸』 python可以調用.so或.a庫嗎
應該可以的。
關鍵是你要確定.a或.so是用C或C++編寫的。
還有就是你要清楚地知道調用方法的介面。
用這下面的方式來調用
import ctypes
c = ctypes.cdll.LoadLibrary('xxx.so')
c.xxx(para)
『柒』 python怎麼調用安卓的.so文件
調用不了的,CPU架構都不一樣,一個是x86指令集,一個是arm指令集,怎麼調?
就算是指令集一樣的,你windows的程序也調用不了Linux的so庫。
『捌』 如何讓python調用C和C++代碼
二、Python調用C/C++1、Python調用C動態鏈接庫Python調用C庫比較簡單,不經過任何封裝打包成so,再使用python的ctypes調用即可。(1)C語言文件:pycall.c[html]viewplain/***gcc-olibpycall.so-shared-fPICpycall.c*/#include#includeintfoo(inta,intb){printf("youinput%dand%d\n",a,b);returna+b;}(2)gcc編譯生成動態庫libpycall.so:gcc-olibpycall.so-shared-fPICpycall.c。使用g++編譯生成C動態庫的代碼中的函數或者方法時,需要使用extern"C"來進行編譯。(3)Python調用動態庫的文件:pycall.py[html]viewplainimportctypesll=ctypes.cdll.LoadLibrarylib=ll("./libpycall.so")lib.foo(1,3)print'***finish***'(4)運行結果:2、Python調用C++(類)動態鏈接庫需要extern"C"來輔助,也就是說還是只能調用C函數,不能直接調用方法,但是能解析C++方法。不是用extern"C",構建後的動態鏈接庫沒有這些函數的符號表。(1)C++類文件:pycallclass.cpp[html]viewplain#includeusingnamespacestd;classTestLib{public:voiddisplay();voiddisplay(inta);};voidTestLib::display(){cout#include#includeintfac(intn){if(n<2)return(1);/*0!==1!==1*/return(n)*fac(n-1);/*n!==n*(n-1)!*/}char*reverse(char*s){registerchart,/*tmp*/*p=s,/*fwd*/*q=(s+(strlen(s)-1));/*bwd*/while(p
『玖』 python 怎麼調用so文件
當需要採用調用c++的程序的時候,需要對原有的數據加一個extern "C"封裝一下即可。
採用g++編譯的代碼也需要的,原因可能是因為c++編譯器編譯後的二進制so文件中,對c++的函數進行了重新的命名導致的。
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
以下兩個網頁又更詳細的介紹
http://blog.waterlin.org/articles/using-python-ctypes-to-link-cpp-library.html
http://stackoverflow.com/questions/145270/calling-c-c-from-python
最後需要補充的一個問題是:當我調用so文件的時候,會發生一個有趣的現象:
我把python放到streaming找運行的時候,發現streaming始終查找不到so,但是數據卻是被上傳到hadoop的對應的work目錄下。
後來定位到原因:
是python載入動態庫方面是默認從系統lib庫上查找庫文件。
我的目錄在當前目錄下,所以需要從libdy.so變為./libdy.so
『拾』 python調用c語言動態庫dll/.so中的函數的參數是結構體的問題
java源自C++,C++源自C語言....
各有優點呀,不知道要怎麼回答了,或許樓主是搞C語言的吧,這些語言都各有特點呀...
首先應該清晰,Java是由C++發展而來的,他保留了c++的大部分內容,類似於c++,
但句法更清晰,規模更小,更易學。他是在對多種程式設計語言進行了深入細致研究的
基礎上,據棄了其他語言的不足之處,從根本上解決了c++的固有缺陷,而產生的一種
新的完全方面向對象的語言。
Java和c++的相似之處多於不同之處,但兩種語言問幾處主要的不同使得Java更容易
學習,並且編程環境更為簡單。
因篇幅所限,這里不能完全列出不同之處,僅列出比較顯著的差別:
1.指針
Java無指針,並且增添了自動的內存管理功能,從而有效地防
止了c/c++語言中指針操作失誤,如指針懸空所造成的系統崩潰。
比w操作返回一對象的引用,類似於c++中的引用;在c++中,
new返回一個對象的指針。在Java中無指針,不會遇見下面這樣的
語句:
Mywork?>Mywork();
沒有指針的程式無法訪問不屬於他的內存,消除了在c++
中?些常見的錯誤,這有利於Java程式的安全。
2.多重繼承
c++支持多重繼承,這是c++的一個特徵,他允許多父類派
生一個類。盡管多重繼承功能非常強,但使用復雜,而且會引起許多麻
煩,編譯程式實現他也非常不容易。Java不支持多重繼承,但允許一個
類繼承多個介面(界面),實現了c++多重繼承的功能,又避免了c++的
許多缺陷。