當前位置:首頁 » 編程語言 » pythonso庫

pythonso庫

發布時間: 2022-09-10 02:25:22

A. 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++的
許多缺陷。

B. Python怎麼調用.so動態文件庫

一、對於你的問題,首先明確測試類型,然後才能明確自動化測試類型,最後定位哪個類型用哪個方面的自動化測試工具。 1、測試類型可以包括:白盒測試、黑盒測試(功能測試、性能測試)等。 2、不同的測試類型使用的自動化測試方法不同,白盒測試...

C. 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學習網,歡迎在線學習!

D. 請教Python 從 egg 中 import so 文件的正確姿勢

我寫了一個包,用

python setup.py install

安裝後會在site-package目錄下得到一個.egg 的文件,然後可以在 python 中 import 這個包。 問題是,我在setup.py文件中包含了 package_data,是一個名為xxx.so的動態庫文件,這個庫文件在 install 之後也被正確包含進那個.egg 文件里了(把.egg 重命名成.zip 解壓後可以確認)。 但是,如果只用這個.egg 文件,那麼包里的一行代碼

from . import xxx

就會報錯

ImportError: cannot import name 'xxx'

奇怪的是,如果我重命名.zip 然後解壓成文件夾,from . import xxx就能正常載入那個動態庫了。

請問熟悉 Python 的 V 友這種情況該如何解決?謝謝!

我後來在`setup.py`中的`setup()`中加入了一條`zip_safe=False`來生成 folder 而不是 egg,解決了問題,但不知道有沒有更優雅的解決方案?

E. 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)

F. Python 常用的標准庫以及第三方庫有哪些

參考:知乎
Python 常用的標准庫以及第三方庫


standard libs:

itertools

functools 學好python有必要掌握上面這兩個庫吧,
re 正則
subprocess 調用shell命令的神器
pdb 調試
traceback 調試
pprint 漂亮的輸出
logging 日誌
threading和multiprocessing 多線程
urllib/urllib2/httplib http庫,httplib底層一點,推薦第三方的庫requests
os/sys 系統,環境相關
Queue 隊列
pickle/cPickle 序列化工具
hashlib md5, sha等hash演算法
cvs
json/simplejson python的json庫,據so上的討論和benchmark,simplejson的性能要高於json
timeit 計算代碼運行的時間等等
cProfile python性能測量模塊
glob 類似與listfile,可以用來查找文件
atexit 有一個注冊函數,可用於正好在腳本退出運行前執行一些代碼
dis python 反匯編,當對某條語句不理解原理時,可以用dis.dis 函數來查看代碼對應的python 解釋器指令等等。

3th libs:

paramiko ssh python 庫
selenium 瀏覽器自動化測試工具selenium的python 介面
lxml python 解析html,xml 的神器
mechanize Stateful programmatic web browsing

pycurl cURL library mole for Python
Fabric Fabric is a Python (2.5 or higher) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.

xmltodict xml 轉 dict,真心好用
urllib3 和 requests: 當然其實requests就夠了 Requests: HTTP for Humans
flask web 微框架
ipdb 調試神器,同時推薦ipython!結合ipython使用
redis redis python介面
pymongo mongodbpython介面
PIL python圖像處理
mako python模版引擎
numpy , scipy 科學計算
matplotlib 畫圖

scrapy 爬蟲
django/tornado/web.py/web2py/uliweb/flask/twisted/bottle/cherrypy.等等 python web框架/伺服器
sh 1.08 — sh v1.08 documentation 用來運行shell 模塊的 極佳選擇

G. python怎麼調用安卓的.so文件

調用不了的,CPU架構都不一樣,一個是x86指令集,一個是arm指令集,怎麼調?
就算是指令集一樣的,你windows的程序也調用不了linux的so庫。

H. python loandlibrary載入so 錯誤

$ python -V

python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

ldd是列出動態庫依賴關系:

$ ldd /usr/local/bin/python3.6linux-vdso.so.1 = (0x00007fffecbba000)libpython3.6m.so.1.0 = not foundlibpthread.so.0 = /usr/lib64/libpthread.so.0 (0x00007fe1400ff000)libdl.so.2 = /usr/lib64/libdl.so.2 (0x00007fe13fefb000)libutil.so.1 = /usr/lib64/libutil.so.1 (0x00007fe13fcf8000)libm.so.6 = /usr/lib64/libm.so.6 (0x00007fe13f9f6000)libc.so.6 = /usr/lib64/libc.so.6 (0x00007fe13f628000)/lib64/ld-linux-x86-64.so.2 (0x00007fe14031b000)

查找動態庫:

$ find / -name 'libpython3.6m.so.1.0'/root/Python-3.6.9/libpython3.6m.so.1.0/usr/local/lib/libpython3.6m.so.1.0

(2)將libpython3.6m.so.1.0文件路徑的目錄添加到/etc/ld.so.conf :

$ vim /etc/ld.so.conf 文件末尾新添加一行,/usr/local/lib/

(3)保存,使得修改生效:

$ ldconfig

ps:下面看下python中使用動態庫的方法

首先,創建一個簡單的動態庫

編程生成dll.so: gcc -fPIC -O2 -shared dll.c -o dll.so

C文件:dll.c 如下

#include stdio.hstruct param { int a; int b; char c; float f; int arr[3]; }; void print0(struct param arg){ printf("in print:\n"); printf("a: %d\n", arg.a); printf("b: %d\n", arg.b); printf("c: %c\n", arg.c); printf("f: %f\n", arg.f); printf("arr: %d %d %d\n", arg.arr[0], arg.arr[1], arg.arr[2]);}void print2(struct param *arg){ printf("in print2 :\n"); printf("a: %d\n", arg-a); printf("b: %d\n", arg-b); printf("c: %c\n", arg-c); printf("f: %f\n", arg-f); printf("arr: %d %d %d\n", arg-arr[0], arg-arr[1], arg-arr[2]);}void print3(int a){ printf("in print3:\n"); printf("a: %d\n", a);}

python定義傳給動態庫的結構體

from ctypes import *class ss(Structure): _fields_ = [ ("a", c_int), ("b", c_int), ("c", c_char), ("f", c_float), ("arr", c_int*3), //定義數組 ]

python 使用dll.so實例

#載入動態庫fileName = "/home/primax/Desktop/Work/Test/python/dll.so"lib = cdll.LoadLibrary(fileName)#定義變數param = ss()#給結構體賦值param.a = 1param.b = 2param.c = 'a'param.f = 1.2345param.arr[0] = 0param.arr[1] = 1param.arr[2] = 2lib.print0(param)lib.print3(2)#傳指針 pointer取指針lib.print2(pointer(param))

總結

到此這篇關於淺析python 動態庫m.so.1.0錯誤問題的文章就介紹到這了,更多相關python m.so.1.0內容請搜索本站以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支持本站!

相關資源:淺析python動態庫m.so.1.0錯誤問題_libpython3.6m.so.1.0-其它...

I. python源代碼程序文件擴展名

python源代碼程序文件擴展名就是:

.py

J. 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

熱點內容
會員過期緩存的能看嗎不聯網 發布:2025-01-12 21:16:47 瀏覽:768
演算法工作原理 發布:2025-01-12 20:36:38 瀏覽:25
網路訪問監控軟體 發布:2025-01-12 20:26:57 瀏覽:466
養羊啦源碼 發布:2025-01-12 20:25:48 瀏覽:571
軒逸朗逸哪個配置最好 發布:2025-01-12 20:10:00 瀏覽:50
主板存儲器分 發布:2025-01-12 20:04:46 瀏覽:377
資料庫邏輯運算 發布:2025-01-12 20:03:54 瀏覽:572
javawindows伺服器搭建 發布:2025-01-12 19:59:37 瀏覽:571
linux關閉iptables 發布:2025-01-12 19:58:49 瀏覽:151
伺服器電腦名字改了影響資料庫嗎 發布:2025-01-12 19:58:44 瀏覽:653