Как сделать Python Extensions для Windows для начинающих - PullRequest
3 голосов
/ 23 марта 2010

Я искал в интернете, пытаясь найти хорошее пошаговое руководство по расширению Python в Windows, и мне не удалось найти что-то для моего уровня квалификации.

допустим, у вас есть некоторый код на c, который выглядит следующим образом:

#include <stdio.h>
#include <math.h>

double valuex(float value, double rate,  double timex)
{
    float value;
    double rate, timex;
    return value / (double) pow ((1 + rate), (timex));
}

и вы хотите превратить его в модуль Python 3 для использования в системе Windows (64-битная, если это имеет значение). Как бы вы поступили так? Я посмотрел SWIG и Pyrex, и в обоих случаях они кажутся ориентированными на пользователя Unix. С Pyrex я не уверен, работает ли он с Python 3.

Я просто пытаюсь изучить основы программирования, используя некоторые практические примеры.

Наконец, если есть хорошая книга, которую кто-то может порекомендовать для изучения, я буду очень признателен.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 23 марта 2010

В зависимости от того, что вы пытаетесь сделать, создание вашего «расширения» в виде простой библиотеки DLL и доступ к нему с помощью ctypes может быть, безусловно, самым простым подходом.

Я использовал ваш код, слегка откорректированный и сохраненный как mydll.c:

#include <stdio.h>
#include <math.h>

#define DLL_EXPORT __declspec(dllexport)
DLL_EXPORT double valuex(float value, double rate,  double timex)
    {
    float value;
    double rate, timex;
    return value / (double) pow ((1 + rate), (timex));
    }

Я скачал Tiny C Compiler и вызвал эту команду.

tcc -shared mydll.c

(Я полагаю, что добавление -rdynamic избавит от необходимости разбрызгивать DLL_EXPORT по всей вашей функции def.)

Это сгенерировано mydll.dll. Затем я запустил Python:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) ... on win32
>>> from ctypes import *
>>> mydll = cdll.mydll
>>> valuex = mydll.valuex
>>> valuex.argtypes = [c_float, c_double, c_double]
>>> valuex.restype = c_double
>>> valuex(1.2, 2.3, 3.4)
2.0470634033800796e-21
2 голосов
/ 23 марта 2010

Cython (Pyrex с несколькими разработанными перегибами и решениями, принятыми для практичности) может использовать одну кодовую базу для создания модулей Python 2 и Python 3. Это действительно отличный выбор для создания библиотек для 2 и 3. Руководство пользователя объясняет, как его использовать, но оно не демистифицирует программирование на Windows, C, Python или программирование в целом, хотя и может упростить вещи для тебя.

С SWIG может быть сложно работать, когда вы сталкиваетесь с проблемой, и это не будет особенно благоприятно для создания идиоматического связывания C, на которое вы полагаетесь, с очень естественным ощущением. Для этого вам нужно будет перевернуть обертку в Python, и в этот момент было бы лучше использовать Cython. Для привязок может быть хорошо, что вы не можете посвятить достаточное количество работы, чтобы сделать действительно красиво, и удобно в том, что вы можете выставлять свой API на нескольких языках одновременно.

1 голос
/ 23 марта 2010

Начнем с документации Построение расширений C и C ++ в Windows .

0 голосов
/ 24 марта 2010

На PyCon 2009 я выступил с докладом о том, как писать расширения Python C: Экскурсия Вихря через расширения Python C . В нем нет ничего конкретного для Windows, но он охватывает базовую структуру расширения.

0 голосов
/ 23 марта 2010

Что ж, самый простой способ создания плагинов Python - это использовать C ++ и Boost.Python. В вашем примере модуль расширения будет выглядеть так просто:

#include <boost/python.hpp>
using namespace boost::python;

// ... your valuex function goes here ...

BOOST_PYTHON_MODULE(yourModuleName)
{
    def("valuex", valuex, "an optional documentation string");
}

Boost.Python доступен в популярных операционных системах и должен работать с Python 3 (не проверял его, хотя поддержка была добавлена ​​в 2009 году).

Относительно SWIG: это не только для Unix. Вы можете скачать скомпилированные двоичные файлы Windows или скомпилировать их самостоятельно с помощью MinGW / MSYS.

Вы также можете попробовать Cython, который, как говорят, Python 3 совместим .

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