Компиляция пакета Python через Cython

Я новичок в cython, знает ли кто-нибудь, как скомпилировать проект python через Cython (с относительно низкими накладными расходами), поскольку я продолжаю получать следующую ошибку импорта:

ImportError: нет модуля с именем CythonRelated.testSource.MyClassObject.

Структура моего тестового проекта такая:

CythonRelated/
           setup.py
           testSource/
                  MainCythonTest.py
                  MyClassObject.py
                  MainCythonTest.pyx   
                  MyClassObject.pyx

Где MainCythonTest импортирует класс из модуля MyClassObject (через

from CythonRelated.testSource.MyClassObject import myCustomObj

), инициализирует объект и вызывает метод объекта.

Мой setup.py выглядит так:

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

setup(
    name = "My cython test app",
    ext_modules = cythonize("testSource/*.pyx", include_path = ["."]),
    packages = ["CythonRelated", "CythonRelated.testSource"]
)

Что мне не хватает?

Взятие setup.py за пределы CythonRelated (и, очевидно, обновление соответствующего пути к файлам * .pyx в cythonize) тоже не помогло

MyClassObject.py

import sys
print sys.version_info

class myCustomObj():
    def __init__(self, value):
        self.value_ = value

    def classInfo(self):
        print "calling class {0} object with value of  {1}".format(self.__class__.__name__,
                                                                  self.value_)

MainCythonTest.py

import pyximport; pyximport.install()

from CythonRelated.testSource.MyClassObject import myCustomObj

def myFunc():

    aObj = myCustomObj(12)

    bObj = myCustomObj(21)

    bObj.classInfo()

    aObj.classInfo()

    print "myFunc called"

myFunc()

person schmi    schedule 14.02.2017    source источник


Ответы (1)


Вам все равно нужно переместить setup.py файл, так как он не может быть частью проекта, который он «компилирует».

Тогда основная проблема в том, что вам не хватает __init__.py файлов в CythonRelated и CythonRelated/testSource. Без этого файла каталог не является импортируемым модулем Python. С этими двумя изменениями я мог pip install --user -e . пакет, а также запустить программу MainCythonTest.py

person Pierre de Buyl    schedule 15.02.2017
comment
Спасибо - но тогда кажется, что питон не принимает скомпилированные версии. Попробуйте удалить файлы .py и установить только с .pyx, он не может найти модули, когда вы начинаете их импортировать (хотя установка проходит без ошибок) Или вам всегда нужно сохранять файлы .py? Тогда как можно быть уверенным, что он принимает скомпилированную версию? Я видел это: stackoverflow.com/questions/6584457/, но в любом случае ... - person schmi; 15.02.2017
comment
Хорошо, я этого не уловил. Я просто скопировал содержимое файла .pyx. Когда вы цитонизируете .py файл, нет необходимости оставлять .py файл. Вы можете просто удалить его. - person Pierre de Buyl; 15.02.2017