python編譯成so
㈠ windows安裝mod_python未生成mod_python.so
在windows上需要.so是非常奇怪的……因為那是linux下動態鏈接庫的拓展名。windows下是dll。
題主最好轉到linux下去做這些。
㈡ 如何編譯C++文件為Python擴展模塊
大概有三種常用方法:
1>使用ctypes模塊來調用C寫的共享庫,比如:
[python] view plain  print?
#測試ctypes調用linux動態庫的能力  
from ctypes import *  
lib = CDLL("libc.so.6")  
printf = lib.printf  
printf("Hello World\n")  
#查找動態庫  
from ctypes.util import find_library  
print find_library('c')  
output = CDLL(find_library("c")).printf  
output("測試成功!\n")  
但是用它來調用C++寫的so就不太合適,因為編譯時c++函數名修飾會給你的函數取一個特殊的字元串,你不能在你的python代碼里直接使用此函數名,除非你使用的是修飾後的函數名。(在linux下你可以用nm來查看so中的函數名)
2>用C來寫python的擴展模塊,這個沒怎麼用過,以後使用時再記錄在此。
3>用C++來寫python擴展模塊:
我是使用Boost.Python來寫擴展的,先上工作中的代碼片段:
[python] view plain  print?
#include <boost/python.hpp> //包含boost.python頭文件  
#include <cstdio>  
#include <string>  
using namespace boost::python;//引入命令空間  
class lshw //定義一個類  
{  
public:  
lshw();  
virtual ~lshw();  
void scan_device();  
string get_xml();  
private:  
hwNode *computer;  
};  
lshw::lshw()  
{  
computer = new hwNode("computer", hw::system);  
}  
lshw::~lshw()  
{  
if (computer)  
delete computer;  
}  
void lshw::scan_device()  
{  
enable("output:numeric");  
disable("output:sanitize");  
scan_system(*computer);  
}  
string lshw::get_xml()  
{  
return computer->asXML();  
}  
void hello()  
{  
std::cout << "Hello World!" <<std::endl;  
}  
BOOST_PYTHON_MODULE(lshw)  
{  
class_<lshw, boost::nonable > ("lshw", "This is a lshw project python extend", init<>())//導出類中的方法  
.def("scan_device", &lshw::scan_device)  
.def("get_xml", &lshw::get_xml)  
;  
def("hello",&hello);//導出方法  
}  
使用boost.python其實結構很簡單,你只要寫很少的boost.python的代碼,你可以把大部分的精力放在C++功能代碼上,花很少的精力就可以把它擴展成python的模塊。下面是我在Ubuntu11.10上的編譯過程:
首先安裝boost.python:
sudo apt-get install libboost-python1.46.1
再來編譯生成so共享庫文件:
g++ -shared -fPIC lshw.cc -o lshw.so -lboost_python
使用:
[python] view plain  print?
import lshw  
hw = lshw.lshw()  
lshw.hello()  
hw.scan_device()  
xml = self.hw.get_xml()
㈢ 【python-C相互調用】python里的dict如何作為參數傳入.so中的c語言函數
#include<stdio.h>
#include<stdlib.h>
#include<Python.h>
staticPyObject*
wmf_reverse(PyObject*self,PyObject*args,PyObject*kwargs){
staticchar*kwlist[]={"name",NULL};
char*name=NULL;
PyObject*retval=NULL;
//問題1:只取一個字元串,format應該是"s"
//>>>if(PyArg_ParseTupleAndKeywords(args,keyds,"isi",kwlist,&name))
if(PyArg_ParseTupleAndKeywords(args,kwargs,"s",kwlist,&name)){
retval=(PyObject*)Py_BuildValue("i",1);
printf("%s ",name);
//問題2:不要釋放
//>>>free(name);
}else{
retval=(PyObject*)Py_BuildValue("i",0);
}
returnretval;
}
staticPyMethodDef
wmf_methods[]={
{"reverse",(PyCFunction)wmf_reverse,METH_VARARGS|METH_KEYWORDS,"reverse"},
//問題3:方法定義表,應該用一條空記錄來表示結束。
{NULL,NULL,0,NULL},
};
//問題4:沒有定義mole
staticstructPyMoleDef
wmf_mole={
PyMoleDef_HEAD_INIT,
"wmf",/*nameofmole*/
NULL,/*moledocumentation,maybeNULL*/
-1,/*sizeofper-interpreterstateofthemole,
or-.*/
wmf_methods,
};
//問題5:入口函數要聲明為:PyMODINIT_FUNC
PyMODINIT_FUNC
PyInit_wmf(void){
//問題6:Py_InitMole要初始化的是模塊,不是方法。所以傳方法定義是錯誤的。
//另外,python2.x是用Py_Init_mole,python3.x改用PyMole_Create了。
//兩者略有差別,自己注意一下吧。這里我用的是python3.x。
//Py_InitMole("wmf",ExtestMethods);
PyObject*m;
m=PyMole_Create(&wmf_mole);
if(m==NULL){
returnNULL;
}
returnm;
}
㈣ python調用動態庫(並且動態庫依賴其它動態庫)
用depends看一下導出了沒有?一般只要標准格式導出就可以使用的。
㈤ 能否介紹一下用python編寫和編譯文件後的後綴名的意思嗎
除了GUI程序,其它類型的沒有特殊的後綴。
例如:
利用py2exe模塊
hello.py 代碼
print 'hello,world!'
raw_input('Press <enter>')
配置 setup.py 代碼
from distutils.core import setup
import py2exe
setup(console=['hello.py'])
最後你將兩個文件存放在一塊。在cmd下執行 c:pythonx.xpython setup.py py2exe
也有其它庫完成exe。如:PyInstaller+pywin32

(5)python編譯成so擴展閱讀:
Python在執行時,會將py文件中的源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。
Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。這里的高級並不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。
㈥ python怎麼調用安卓的.so文件
調用不了的,CPU架構都不一樣,一個是x86指令集,一個是arm指令集,怎麼調?
就算是指令集一樣的,你windows的程序也調用不了Linux的so庫。
㈦ python *.so 文件 怎麼生成的
openstack是最近3年學習python的人最值得學習的一個雲計算框架。 OpenStack 包含兩個主要模塊:Nova 和 Swift,前者是 NASA 開發的虛擬伺服器部署和業務計算模塊;後者是 Rackspace開發的分布式雲存儲模塊,兩者可以一起用,也可以分開單獨用。
㈧ python程序py文件能做成so文件嗎
可以
一、環境准備
安裝cython,以及gcc編譯環境
wget get-pip.py
python get-pip.py
pip install cython
yum install -y gcc python-devel
二、編寫測試腳本
test.py,內容如下
import os
def test():
print  os.path.realpath('.')
三、將其拷貝到python系統路徑
/usr/lib/python2.7/site-packages/test
在test目錄下創建__init__.py, 與 test.py 的文件
test.py 上面內容如上所示
四、腳本測試
python
>>> import lyh.test
>>> lyh.test.test()
五、編譯so文件
以下操作均在 /usr/lib/python2.7/site-packages/test 路徑下執行
1. cython test.py
2. gcc -c -fPIC -I/usr/include/python2.7/ test.c
3. gcc -shared test.o -o test.so
六、驗證so文件的可用性
1. 移除/usr/lib/python2.7/site-packages/test/test.py 文件,只保留 test.so文件
test
├── __init__.py
└── test.so
2.
python
>>> import test.test
>>> test.test.test()
可以執行
驗證完成
七、使用setup.py 編譯so
1. 編寫setup.py文件,位於/usr/lib/python2.7/site-packages/test,內容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_moles = cythonize("test.py")
)
2.然後運行
setup.py build_ext --inplace
㈨ python *.so 文件 怎麼生成的
這個要看你是什麼伺服器了,要版本對上了才能用,而且python不用apache也能運行web啊
㈩ 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
