Подтвердить что ты не робот

Создание 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 (который является единственным коммерческим продуктом, доступным здесь), но даже самый простой пример не смог бы построить.

4b9b3361

Ответ 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)