Создание 64-битных расширений Python C в Windows
Я задаю этот вопрос, потому что мне нужно создать специальный модуль (aspell_python, http://wm.ite.pl/proj/aspell-python/) для работы с моим 64-битным Python 2.6, который работает на Windows 7 (конечно, 64-разрядная) машина. Я также всегда хотел знать, как ускорить некоторые функции с помощью кода C, поэтому я хотел бы сделать мои собственные внешние C-модули для Python в будущем.
Может кто-нибудь скажет мне шаги, необходимые для успешного создания 64-битного расширения Python в C? Я знаю Python, я знаю C, но я не знаю, что касается Visual Studio или Windows. Я попытался следовать официальному руководству на веб-сайте Python (http://docs.python.org/extending/windows.html#building-on-windows) с помощью Visual Studio 2008 (который является единственным коммерческим продуктом, доступным здесь), но даже самый простой пример не смог бы построить.
Ответы
Ответ 1
Я успешно скомпилировал C-расширения для Python в 64-разрядной Windows, выполнив следующие команды из "Visual Studio 2008 x64 Win64 Command Prompt" в каталоге верхнего уровня исходного дистрибутива расширения:
set DISTUTILS_USE_SDK=1
set MSSdk=1
python setup.py install
Ответ 2
Я бы использовал Shed Skin: просто скачайте, разархивируйте, запустите bat инициализации и скомпилировать ваш код Python.
Если это не сработает, и вы можете заставить среду компилятора Microsoft C работать, попробуйте Cython. В этом руководстве сравнивается нормальное расширение Python с его сгенерированной версией C. Обновленные выдержки:
c_prime.pyx:
def calculate(long limit):
cdef long current
cdef long divisor
primes = []
divisor = 0
for current in range(limit):
previous = []
for divisor in range(2, current):
if current % divisor == 0:
break
if divisor == current - 1:
primes.append(current)
return primes
setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'PrimeTest',
ext_modules=[
Extension('c_prime', ['c_prime.pyx'])
],
cmdclass = {'build_ext': build_ext}
)
компиляции:
python setup.py build_ext --inplace --compiler=msvc
test_prime.py:
from timeit import Timer
t = Timer('c_prime.calculate(10000)', 'import c_prime')
reps = 5
print(sum(t.repeat(repeat=reps, number=1)) / reps)