2010-03-23 3 views
3

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

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

#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 модуля для использования на окнах (64bit, если это делает разницу) системы. Как бы вы это сделали? Я просмотрел SWIG и Pyrex, и в обоих случаях они, похоже, ориентированы на пользователя unix. С Pyrex я не уверен, работает ли он с Python 3.

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

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

спасибо.

+0

@JR, Cython отлично подходит для пользователей Windows. –

+0

@JR, есть ли ошибка выше? Предположительно, вы хотели вывести вывод 'pow()' в double? –

+0

Спасибо, я проведу Cython и посмотрю, что может сделать мой мозг моего новичка. А что касается тебя последней, да, я думаю, ты прав. Я просто написал, что на работе, непроверенный. –

ответ

0

Ну, самый простой способ создания плагинов 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. Вы можете скачать precompiled Windows binaries или скомпилировать его самостоятельно с помощью MinGW/MSYS.

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

2

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

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

2

В зависимости от того, что вы пытаетесь сделать, создание вашего «расширения» как простой библиотеки 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 всей вашей функции DEFS.)

Это вызвало 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 
+0

+1, Вот как я это делал в прошлом. Если вы делаете это по соображениям производительности, вы должны знать, что ctypes добавляет немного накладных расходов. Этот парень провел несколько тестов: http://tungwaiyip.info/blog/2009/07/16/ctype_performance_benchmark – FogleBird

+0

@FogleBird, спасибо за ссылку! В итоге он, по-видимому, говорит, что ctypes, возможно, в 2-3 раза медленнее для вызывающего механизма, чем более прямые подходы, что делает его неудовлетворительным для «мелкозернистой» работы (т. Е. Многие вызовы для коротких процедур). (Это одна из причин, по которым я предупреждал «в зависимости от того, что вы пытаетесь сделать».) –

+0

Я пробовал это, но, к сожалению, tcc для окон поддерживает только 32-разрядные версии (по крайней мере, согласно readme), что объясняет, почему я не мог загрузить .dll в этой строке «mydll = cdll.mydll». В настоящее время я пытаюсь настроить Cython, и я думаю, что я почти там. –

0

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