Вызов C / C ++ из Python?

Java выполняет раннее связывание для статических методов, в отличие от методов экземпляров, которые динамически связаны.

Поскольку ваша объектная переменная имеет тип Main, вызов привязан к реализации суперкласса во время компиляции.

Хорошее объяснение доступно здесь .

479
задан Peter Mortensen 4 October 2017 в 22:55
поделиться

8 ответов

Необходимо взглянуть на Повышение. Python . Вот краткое введение, взятое от их веб-сайта:

Повышение Библиотека Python является платформой для взаимодействия через интерфейс с Python и C++. Это позволяет Вам быстро, и беспрепятственно представьте функции классов C++ и объекты к Python, и наоборот, не используя специальных инструментов - просто Ваш компилятор C++. Это разработано для обертывания интерфейсов C++ ненавязчиво, так, чтобы Вы не изменяли код C++ вообще для обертывания его, делая Повышение. Идеал Python для представления сторонних библиотек к Python. Использование библиотекой усовершенствованных методов метапрограммирования упрощает свой синтаксис для пользователей, так, чтобы обертывание кода взяло вид своего рода декларативного языка определения интерфейсов (IDL).

155
ответ дан Peter Mortensen 4 October 2017 в 22:55
поделиться

Один из официальных документов Python содержит детали о расширяющийся Python с помощью C/C++ . Даже без использования БОЛЬШОЙ ГЛОТОК , it’s довольно простой и работы отлично над Windows.

7
ответ дан Palec 4 October 2017 в 22:55
поделиться
  • 1
    @martineau, мое целое схватывание - это you' ре, пытающееся обойти утиный ввод. Правильное решение, по-моему, lambda e: e[:1].upper() + e[1:]. – dbkaplun 15 August 2012 в 15:05

Выезд пирекс или Cython. Они - подобные Python языки для взаимодействия через интерфейс между C/C++ и Python.

28
ответ дан Peter Mortensen 4 October 2017 в 22:55
поделиться

Самый быстрый способ сделать это использует БОЛЬШОЙ ГЛОТОК .

Пример от БОЛЬШОГО ГЛОТКА учебное руководство :

/* File : example.c */
int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

Интерфейсный файл:

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
%}

extern int fact(int n);

Здание модуль Python на Unix:

swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/local/include/python2.7
gcc -shared example.o example_wrap.o -o _example.so

Использование:

>>> import example
>>> example.fact(5)
120

Примечание, что у Вас должен быть python-dev. Также в некотором системном Python заголовочные файлы будут в/usr/include/python2.7 на основе способа, которым Вы установили его.

Из учебного руководства:

БОЛЬШОЙ ГЛОТОК является довольно полным компилятором C++ с поддержкой почти каждой функции языка. Это включает предварительную обработку, указатели, классы, наследование и даже шаблоны C++. БОЛЬШОЙ ГЛОТОК может также привыкнуть к структурам пакета и классам в прокси-классы на выходном языке — представление базовой функциональности очень естественным способом.

51
ответ дан mmohaveri 4 October 2017 в 22:55
поделиться

I’ve никогда не использовал его, но I’ve слышал хорошие вещи [приблизительно 111] ctypes. Если you’re, пытающиеся использовать это с C++, несомненно, уклонятся от искажения имени через extern "C" . спасибо за комментарий, Florian BГ¶sch.

15
ответ дан Community 4 October 2017 в 22:55
поделиться
  • 1
    да я должен использовать ls и grep, но спасибо так или иначе – k13n 18 October 2011 в 19:13

ctypes является частью стандартной библиотеки, и поэтому более стабилен и широко доступен, чем большой глоток , который всегда имел тенденцию давать мне проблемы .

С ctypes, необходимо удовлетворить любую зависимость времени компиляции от Python, и привязка будет работать над любым Python, который имеет ctypes, не только тот, против которого это было скомпилировано.

предположим у Вас есть простой класс C++ в качестве примера, с которым Вы хотите говорить в файле, названном foo.cpp:

#include <iostream>

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
};

, Так как ctypes может только говорить с функциями C, необходимо предоставить тем, которые объявляют их как экстерн "C"

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo){ foo->bar(); }
}

Затем, необходимо скомпилировать это в общую библиотеку

g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o

, И наконец необходимо записать обертку Python (например, в fooWrapper.py)

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bar(self.obj)

, Как только у Вас есть это, можно назвать его как [1 114]

f = Foo()
f.bar() #and you will see "Hello" on the screen
606
ответ дан Ciro Santilli 新疆改造中心996ICU六四事件 4 October 2017 в 22:55
поделиться
  • 1
    Помните, aColumnIndex the column at which the data can be found in the cursor. Я использовал Cursor.getColumnIndex для сравнения с. – theblang 21 November 2013 в 22:28

Данная статья, утверждая Python быть всем ученый нуждается , в основном говорит: Первый прототип все в Python. Тогда, когда необходимо ускорить часть, используйте БОЛЬШОЙ ГЛОТОК и переведите эту часть в C.

18
ответ дан Peter Mortensen 4 October 2017 в 22:55
поделиться
  • 1
    это была ошибка опечатки поместить запятую там. – Kracekumar 19 November 2010 в 11:50

Можно использовать Мост Языка Scapix для автоматической генерации привязки Python непосредственно от заголовков C++ как часть сборки.

Добавляют вызов к scapix_bridge_headers() в Ваш файл CMakeLists.txt, затем разрабатывают Ваш проект с cmake -DSCAPIX_BRIDGE=python. Посмотрите полный пример .

Правовая оговорка: я - автор Мост Языка Scapix .

0
ответ дан 3 October 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: