У меня есть код C, который имеет некоторые основные функции. Я хочу иметь возможность вызывать эти C-функции из моего кода на Python. Кажется, есть много методов, чтобы сделать это, когда я ищу в Интернете, но они выглядят немного сложнее. Может ли кто-нибудь предложить, который является самым простым и лучшим методом для вызова функций C из python без каких-либо проблем?Лучший способ вызова функции C из кода python
ответ
Вы можете использовать общую библиотеку с использованием компилятора C и выполнять вызовы функций, определенных в библиотеке, к этому вы можете использовать модуль CPython.
, почему проголосовать за мой ответ? –
Ваши два предложения верны, но они не имеют никакого логического отношения друг к другу. Ваш ответ не помогает ОП решить свою проблему. –
Допустим, что ваш с код посылает по электронной почте, а код принять арг как этот
./sendemail email title body
Тогда из питона, вы можете сделать что-то вроде:
from subprocess import call
call(["./sendemail", "[email protected]", "subject", "body"])
На самом деле это не интеграция с C в каком-либо значимом смысле. Это просто вызов скомпилированной программы с аргументами командной строки. Для этого все должно быть преобразовано в строки и из них. Это * может быть жизнеспособным вариантом в зависимости от потребностей OP, но я думаю, что вы не заметили отметки. –
Я написал этот метод, потому что OP, похоже, недостаточно осведомлен, чтобы импортировать c-код в python и запустить его. – taesu
@taesu вот почему он задал вопрос - надеюсь, вы не подразумеваете, что он не может изучать новые вещи;) – viraptor
Cffi библиотека является довольно современный подход к этому. Он также работает через python и pypy.
Если у вас есть свои функции, содержащиеся в общей библиотеке, вы можете просто импортировать их как методы python. Взгляните на примеры здесь: http://cffi.readthedocs.org/en/latest/overview.html
, вы ссылаетесь на плохую часть документов, уровень ABI действительно опасен и его следует избегать (если у вас нет другого выбора). Вы не знаете библиотеку или операционную систему автора вопроса – fijal
Это может быть опасно, это может быть нормально. В документе перечислены всевозможные способы доступа к библиотеке. Я удалил конкретный якорь в abi, но именно потому, что автор не указал его, он является правильным ответом, как и любым другим способом. (Я имею в виду, что они должны будут сделать выбор в конце, так как нам не хватает деталей.) – viraptor
Если вы хотите расширить 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
- 1. Лучший способ вызова C-функций из python?
- 2. Лучший способ вызова управляемого кода (C#) из неуправляемого C++
- 3. Лучший способ вызова кода из разных проектов в решении C#
- 4. лучший способ вызова функции из расширенного класса
- 5. Лучший способ вызова кода модуля в nodejs
- 6. Лучший способ вызова метода - Python
- 7. Python - лучший способ вызова суперкласса?
- 8. Самый быстрый способ вызова функции C из Python
- 9. Лучший способ вызова функции javascript в теге
- 10. Лучший способ вызова функции jQuery из keyup на нескольких полях?
- 11. QT/C++ лучший способ вызова метода родителя
- 12. лучший способ вызова функции (снова и снова)
- 13. Каков наилучший способ вызова кода Java из Python?
- 14. Вложение Python в C++ и методы вызова из кода C++
- 15. Функции вызова из списка - Python
- 16. Лучший способ вызова методов в объявлениях класса Python?
- 17. Предпочтительный/лучший способ вызова функций?
- 18. Python: лучший способ вызова методов из другого класса?
- 19. C# лучший способ вызова .ToString() для объекта
- 20. Лучший способ бросить исключения из кода JNI?
- 21. Вызова C Функции нативного ++ с недействительным * параметром из C# кода
- 22. Лучший способ структурирования кода
- 23. Python вызова функции по имени строки из кода
- 24. лучший способ выбора правильной функции?
- 25. Лучший способ кода вернуть результат истинного/ложного вызова
- 26. Лучший способ вызова метода Child из родителя в наследование C++
- 27. лучший способ проверить производительность кода на C#
- 28. Лучший способ вызова JS из CakePHP действия
- 29. Лучший способ вызова веб-службы из TSQL
- 30. лучший способ написания кода
Этот вопрос является открытым и приведет к субъективным ответам, и как это плохо подходит для stackoverflow. Вы можете задать свой вопрос на странице [comp.lang.python] (https://groups.google.com/forum/#!forum/comp.lang.python). –
Посмотрите на cython – seaotternerd