Как мне соединить Python и C-программу? - PullRequest
3 голосов
/ 20 января 2011

У меня есть программа на Python, которая считывает последовательные данные с порта, подключенного к кабелю RS232Я хочу передать данные, которые я получаю, в C-программу, которая будет обрабатывать ресурсоемкие аспекты.Я проверял сеть, и все, что я нашел, основано на Linux.

Ответы [ 7 ]

7 голосов
/ 20 января 2011

Мое предложение - это функция inline из модуля instant, хотя это работает, только если вы можете сделать все, что вам нужно, в одной функции c.Вы просто передаете ему функцию ac, и она компилирует расширение ac во время выполнения.

    from instant import inline
    sieve_code = """
    PyObject* prime_list(int max) {
        PyObject *list = PyList_New(0);
        int *numbers, *end, *n; 
        numbers = (int *) calloc(sizeof(int), max);
        end = numbers + max;

        numbers[2] = 2;
        for (int i = 3; i < max; i += 2) { numbers[i] = i; }
        for (int i = 3; i < sqrt(max); i++) {
            if (numbers[i] != 0) {
                for (int j = i + i; j < max; j += i) { numbers[j] = 0; }
            }
        }
        for (n = numbers; n < end; n++) { 
            if (*n != 0) { PyList_Append(list, PyInt_FromLong(*n)); }
        }
        free(numbers);
        return list;
    }
    """
    sieve = inline(sieve_code)
6 голосов
/ 20 января 2011

Есть несколько способов сделать это.

  1. Самый простой и простой способ - использовать Python C API и написать оболочку для вашей библиотеки C, которую можно вызывать из Python. Это связывает ваш модуль с CPython.

  2. Второй способ - использовать ctypes , который является FFI для Python, который позволяет загружать и вызывать функции непосредственно из библиотек C. Теоретически это должно работать во всех реализациях Python.

  3. Третий способ - использовать Pyrex или его версию следующего поколения Cython , которая позволяет аннотировать ваш код Python информацией о типах, которую компилятор может преобразовать в скомпилированный код , Он также может быть использован для написания оболочек. AFAIK, это связано с CPython.

  4. Еще один способ - использовать SWIG , который представляет собой инструмент, генерирующий клейкий код, который поможет вам обернуть библиотеки C для использования из Python. Это в основном первый подход с помощником.

  5. Другой способ - использовать Boost Python API , который является объектно-ориентированной оберткой над сырым Python C API.

Все вышеперечисленное позволяет вам выполнять свою работу в одном и том же процессе.

Если это не ограничение, как, например, Digital Ross , вы можете просто запустить подпроцесс и передать аргументы (как в командной строке или через его стандартный ввод), так и сделать так, чтобы внешний процесс выполнял работу. для тебя.

4 голосов
/ 20 января 2011

Используйте трубу и попен

Самый простой способ справиться с этим, вероятно, просто использовать popen(3). Функция popen доступна как в Python, так и в C, и соединяет программу одного языка с другим с помощью канала.

>>> import subprocess
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args)

Как только у вас есть канал, вы, вероятно, должны послать через него yaml или json, хотя я никогда не пытался читать ни на одном из C. Если это действительно простой поток, просто проанализируйте его самостоятельно. Если вам нравится XML, я полагаю, он также доступен.

2 голосов
/ 20 января 2011

Сколько бит в секунду вы проходите через этот кабель RS-232? Есть ли у вас результаты тестов, которые показывают, что Python не будет делать хрустящие биты достаточно быстро? Если программа на C еще не написана, рассмотрите возможность написания интенсивных вычислений в Python, с легким откатом к Cython в случае, если Python недостаточно быстр.

1 голос
/ 20 января 2011

Действительно, этот вопрос не имеет ничего общего с C ++.Сказав это, вы можете попробовать SWIG - он мультиплатформенный и позволяет выполнять функциональные вызовы с Python на C / C ++.

0 голосов
/ 20 января 2011

Я бы использовал ctypes: http://python.net/crew/theller/ctypes/tutorial.html
Это позволяет вам вызывать код c (и c ++) из python.

0 голосов
/ 20 января 2011

Я бы использовал стандартную форму IPC, такую ​​как сокет.

Хорошим началом было бы Руководство Биджа.

Кроме того, не помечайте вопрос с помощьюc ++, если вы специально используете c.с и с ++ разные языки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...