2015-09-02 5 views
-2

У меня есть код C, который имеет некоторые основные функции. Я хочу иметь возможность вызывать эти C-функции из моего кода на Python. Кажется, есть много методов, чтобы сделать это, когда я ищу в Интернете, но они выглядят немного сложнее. Может ли кто-нибудь предложить, который является самым простым и лучшим методом для вызова функций C из python без каких-либо проблем?Лучший способ вызова функции C из кода python

+0

Этот вопрос является открытым и приведет к субъективным ответам, и как это плохо подходит для stackoverflow. Вы можете задать свой вопрос на странице [comp.lang.python] (https://groups.google.com/forum/#!forum/comp.lang.python). –

+0

Посмотрите на cython – seaotternerd

ответ

0

Вы можете использовать общую библиотеку с использованием компилятора C и выполнять вызовы функций, определенных в библиотеке, к этому вы можете использовать модуль CPython.

+0

, почему проголосовать за мой ответ? –

+1

Ваши два предложения верны, но они не имеют никакого логического отношения друг к другу. Ваш ответ не помогает ОП решить свою проблему. –

-1

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

./sendemail email title body 

Тогда из питона, вы можете сделать что-то вроде:

from subprocess import call 
call(["./sendemail", "[email protected]", "subject", "body"]) 
+0

На самом деле это не интеграция с C в каком-либо значимом смысле. Это просто вызов скомпилированной программы с аргументами командной строки. Для этого все должно быть преобразовано в строки и из них. Это * может быть жизнеспособным вариантом в зависимости от потребностей OP, но я думаю, что вы не заметили отметки. –

+0

Я написал этот метод, потому что OP, похоже, недостаточно осведомлен, чтобы импортировать c-код в python и запустить его. – taesu

+0

@taesu вот почему он задал вопрос - надеюсь, вы не подразумеваете, что он не может изучать новые вещи;) – viraptor

1

Cffi библиотека является довольно современный подход к этому. Он также работает через python и pypy.

Если у вас есть свои функции, содержащиеся в общей библиотеке, вы можете просто импортировать их как методы python. Взгляните на примеры здесь: http://cffi.readthedocs.org/en/latest/overview.html

+0

, вы ссылаетесь на плохую часть документов, уровень ABI действительно опасен и его следует избегать (если у вас нет другого выбора). Вы не знаете библиотеку или операционную систему автора вопроса – fijal

+0

Это может быть опасно, это может быть нормально. В документе перечислены всевозможные способы доступа к библиотеке. Я удалил конкретный якорь в abi, но именно потому, что автор не указал его, он является правильным ответом, как и любым другим способом. (Я имею в виду, что они должны будут сделать выбор в конце, так как нам не хватает деталей.) – viraptor

0

Если вы хотите расширить Python с некоторыми функциями C, вы можете проверить следующий пример. Вам нужен модуль, который регистрирует функции обертки для ваших собственных функций.

Для получения дополнительной информации ознакомьтесь с Python docs.

#include <Python.h> 

static PyObject * 
yourfunction(PyObject *self, PyObject *args, PyObject *keywds) 
{ 
    int voltage; 
    char *state = "a stiff"; 
    char *action = "voom"; 
    char *type = "Norwegian Blue"; 

    static char *kwlist[] = {"voltage", "state", "action", "type", NULL}; 

    if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist, 
            &voltage, &state, &action, &type)) 
     return NULL; 

    printf("-- This parrot wouldn't %s if you put %i Volts through it.\n", 
      action, voltage); 
    printf("-- Lovely plumage, the %s -- It's %s!\n", type, state); 

    Py_INCREF(Py_None); 

    return Py_None; 
} 

static PyMethodDef keywdarg_methods[] = { 
    {"yourfunction", (PyCFunction)yourfunction, METH_VARARGS | METH_KEYWORDS, 
    "the doc of your function"}, 
    {NULL, NULL, 0, NULL} /* sentinel */ 
}; 


// in Python 2.x the function name initmodulename is executed when imported 
void initkeywdarg(void) 
{ 
    /* Create the module and add the functions */ 
    Py_InitModule("keywdarg", keywdarg_methods); 
} 

Чтобы скомпилировать файл, вы можете использовать clang. Имейте в виду, что вам нужно исправить путь включения, если заголовки Python находятся где-то в другом месте. Созданный двоичный файл keywdarg.so может быть создан с использованием import keywdarg.

лязг ++ -shared -I/USR/включать/python2.7 -fPIC keywdarg.cpp -o keywdarg.so -lpython

Смежные вопросы