国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Python調(diào)用C/C++方式

PiscesYE / 1259人閱讀

摘要:調(diào)用方式方式一基礎(chǔ)篇這種方法叫做的擴(kuò)展使用這樣調(diào)用引用的頭文件包裹函數(shù),用來(lái)包裹需要轉(zhuǎn)化為的函數(shù),在方法前面加下劃線。定義名稱(chēng)通常和文件名保持一致。執(zhí)行命令在下,使用編譯器生成對(duì)應(yīng)的文件。

Python調(diào)用C++方式 方式一(基礎(chǔ)篇)

這種方法叫做python的擴(kuò)展

int great_function(int a) {
    return a + 1;
}

使用python這樣調(diào)用

>>> from great_module import great_function 
>>> great_function(2)
3
// great_module.c

// 引用python的頭文件
#include 

int great_function(int a) {
    return a + 1;
}

// 包裹函數(shù),用來(lái)包裹需要轉(zhuǎn)化為python的函數(shù),在方法前面加下劃線。
static PyObject * _great_function(PyObject *self, PyObject *args)
{
    int _a;
    int res;

    // 檢查參數(shù)類(lèi)型是否正確,python參數(shù)轉(zhuǎn)化為c
    if (!PyArg_ParseTuple(args, "i", &_a))
        return NULL;
    res = great_function(_a);
    return PyLong_FromLong(res);
}

// 定義的方法表,用于在python中查找
static PyMethodDef GreateModuleMethods[] = {
    {
        "great_function",
        _great_function,
        METH_VARARGS,
        ""
    },
    {NULL, NULL, 0, NULL}
};

// 必須以module名前面加init定義該方法
PyMODINIT_FUNC initgreat_module(void) {
    (void) Py_InitModule("great_module", GreateModuleMethods);
}

在Linux下面,則用gcc編譯:

$ gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7/ -lpython2.7

gcc命令行參數(shù):

-shared

生成一個(gè)共享對(duì)象,可以與其他對(duì)象接連成可執(zhí)行文件

-fPIC

適用于動(dòng)態(tài)鏈接,避免全局偏移表大小的限制,只能在某些機(jī)器上運(yùn)行

在當(dāng)前目錄下得到great_module.so,同理可以在Python中直接使用。

方法二(使用SWIG)
SWIG : Simplified Wrapper and Interface Generator
調(diào)用c

不僅可以用于python,也可以用于其他java/perl/ruby/php/JavaScript/Go。

/* great_module.i */
%module great_module
%{
int great_function(int a) {
    return a + 1;
}
%}
int great_function(int a);

定義module名稱(chēng)通常和文件名保持一致。

%{%}包裹的部分是c語(yǔ)言代碼,這段代碼會(huì)原封不動(dòng)的復(fù)制到mymodule_wrap.c

欲導(dǎo)出的函數(shù)簽名列表。直接從頭文件中復(fù)制過(guò)來(lái)即可

$ swig -c++ -python great_module.i

會(huì)生成對(duì)應(yīng)的great_module_wrap.cgreat_module.py文件

再執(zhí)行:

$ g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so  -I/usr/include/python2.7/ -lpython2.7

生成對(duì)應(yīng)的_great_module.so文件,這時(shí),我們就可以再python中直接調(diào)用了

from great_module import great_function

print great_function(9)

>>> 10
調(diào)用c++

定義一個(gè)頭文件,great_class.h

#ifndef GREAT_CLASS
#define GREAT_CLASS
class Great {
    private:
        int s;

    public:
        void setWall (int _s) {s = _s;};
        int getWall() {return s;};
};
#endif

再定義一個(gè)great_class.i的swig配置文件,這里不用再寫(xiě)一遍SWIG的定義了,直接使用SWIG的%include指令;
在SWIG編譯時(shí)要加-c++這個(gè)選項(xiàng),生成的擴(kuò)展名為cxx

/* great_class.h */

%module great_class
%{
#include "great_class.h"
%}
%include "great_class.h"

執(zhí)行命令:

$ swig -c++ -python great_class.i

在Linux下,使用C++編譯器g++

g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so  -I/usr/include/python2.7/ -lpython2.7

生成對(duì)應(yīng)的_great_class.so文件。現(xiàn)在可以直接在python中輸入

import great_class
c = great_class.Great()
c.setWall(10)
print c.getWall()

>>> 10
參考

知乎作者:Jerry Jho 鏈接

SWIG的官方文檔SWIG Users Manual

GCC命令行選項(xiàng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41194.html

相關(guān)文章

  • Python 調(diào)用 C 動(dòng)態(tài)鏈接庫(kù),包括結(jié)構(gòu)體參數(shù)、回調(diào)函數(shù)等

    摘要:調(diào)用以回調(diào)函數(shù)地址為參數(shù)的函數(shù)這個(gè)主題就稍微繞一些了,也就是說(shuō)在接口中,需要傳入回調(diào)函數(shù)作為參數(shù)。這個(gè)問(wèn)題在中也可以解決,并且回調(diào)函數(shù)可以用定義。代碼代碼很簡(jiǎn)單回調(diào)函數(shù)的傳入?yún)?shù)為,返回參數(shù)也是。 項(xiàng)目中要對(duì)一個(gè)用 C 編寫(xiě)的 .so 庫(kù)進(jìn)行邏輯自測(cè)。這項(xiàng)工作,考慮到靈活性,我首先考慮用 Python 來(lái)完成。 研究了一些資料,采用 python 的 ctypes 來(lái)完成這項(xiàng)工作。已經(jīng)...

    NickZhou 評(píng)論0 收藏0
  • 利用 SWIG 對(duì) C++ 庫(kù)進(jìn)行 Python 包裝

    摘要:可以在接口文件中直接引用庫(kù)里的內(nèi)容,大大方便接口文件的編寫(xiě)。使用庫(kù)里的這里先介紹方式通過(guò)創(chuàng)建出來(lái)的數(shù)組是數(shù)組的直接代理,非常底層和高效,但是,它也和數(shù)組一樣不安全,一樣沒(méi)有邊界檢查。對(duì)由于這種情況,可以使用庫(kù)里的。 如果你也像我們一樣,同時(shí)使用Python和C++,以獲得兩種語(yǔ)言的優(yōu)勢(shì),一定也會(huì)希望尋找一種好的方式集成這兩種語(yǔ)言,相比而言,讓Python能夠方便使用C++的庫(kù)更加重要,...

    jas0n 評(píng)論0 收藏0
  • Python: 你不知道的 super

    摘要:整個(gè)過(guò)程還是比較清晰的,關(guān)鍵是要理解的工作方式,而不是想當(dāng)然地認(rèn)為調(diào)用了父類(lèi)的方法。小結(jié)事實(shí)上,和父類(lèi)沒(méi)有實(shí)質(zhì)性的關(guān)聯(lián)。 super() 的入門(mén)使用 在類(lèi)的繼承中,如果重定義某個(gè)方法,該方法會(huì)覆蓋父類(lèi)的同名方法,但有時(shí),我們希望能同時(shí)實(shí)現(xiàn)父類(lèi)的功能,這時(shí),我們就需要調(diào)用父類(lèi)的方法了,可通過(guò)使用 super 來(lái)實(shí)現(xiàn),比如: class Animal(object): def __...

    darkerXi 評(píng)論0 收藏0
  • 職場(chǎng)經(jīng)驗(yàn)之15個(gè)你必須知道的Python面試題

    摘要:因?yàn)槟憧赡苄枰诠ぷ髦信c一些奇怪的人合作問(wèn)題多線程使用。回答不允許真正意義上的多線程。在學(xué)習(xí)之前,很多人花了很多的時(shí)間在他們的多線程中遇到了瓶頸。 showImg(https://segmentfault.com/img/remote/1460000019609267); 介紹 隨著人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的發(fā)展,這個(gè)領(lǐng)域也正在不斷的進(jìn)入人們的眼簾,并且?guī)?lái)了很多、很大的工作機(jī)會(huì),...

    jayce 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路31-繼承的利弊

    摘要:使用抽象基類(lèi)顯示表示接口如果類(lèi)的作用是定義接口,應(yīng)該將其明確定義為抽象基類(lèi)。此外,抽象基類(lèi)可以作為其他類(lèi)的唯一基類(lèi),混入類(lèi)則決不能作為唯一的基類(lèi),除非這個(gè)混入類(lèi)繼承了另一個(gè)更具體的混入這種做法非常少見(jiàn)。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第五篇,我們將繼續(xù)討論繼承,重點(diǎn)說(shuō)明兩個(gè)方面:繼承內(nèi)置類(lèi)型時(shí)的問(wèn)題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內(nèi)置類(lèi)型 內(nèi)置類(lèi)型...

    tinylcy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

PiscesYE

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<