Работа с Cython в PyCharm - как запустить скомпилированные файлы - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь выяснить, как работать с Cython и столкнуться с некоторыми проблемами. Я использую Python 3.6 и PyCharm Professional в качестве IDE. Текущая среда OSX.

Прежде всего я попытался создать простое приложение, содержащее два файла: common.pyx:

cpdef cppfun(t):
    s = 0
    for i in range(t):
        for j in range(t):
            s = s + i*j
    return s

def pyfun(t):
    s = 0
    for i in range(t):
        for j in range(t):
            s = s + i*j
    return s

и основной файл, который я пытаюсь запустить в PyCharm. Как я понимаю, необходимо скомпилировать мой файл common.pyx в файл ".so". Для этого я создаю файл setup.py со следующим содержимым:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("cmn", ["common.pyx"],
              libraries=["m"], extra_compile_args=["-ffast-math"])
]

setup(
  name="cmn",
  cmdclass={"build_ext": build_ext},
  ext_modules=ext_modules
)

и запустите в терминале эту команду:

python setup.py build_ext --inplace

Поэтому я пытаюсь импортировать скомпилированный файл в мой runner.py:

import time
from ctypes import cdll
cmn = cdll.LoadLibrary('../cmn.cpython-36m-darwin.so')

if __name__ == '__main__':
    count = 100000
    start_time = time.time()
    cmn.pyfun(count)
    print("--- %s seconds ---" % (time.time() - start_time))

    start_time = time.time()
    cmn.cppfun(count)
    print("--- %s seconds ---" % (time.time() - start_time))

Но получил ошибку:

Файл "/path-to-env/lib/python3.6/ctypes/init.py", строка 366, в GetItem func = self._FuncPtr ((name_or_ordinal, self)) AttributeError: dlsym (0x7fb77cd02120, pyfun): символ не найден

В конце концов, я не знаю, как заставить это работать. У меня есть идея, которую я должен использовать:

from common import pyfun, cppfun
import pyximport; pyximport.install()

и избегайте ручной компиляции через терминал, но в этом случае я получаю следующую ошибку:

ModuleNotFoundError: нет модуля с именем 'common'

...