pythonso库
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