2017-02-14 14 views
1

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

ImportError: No module named 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() 

ответ

0

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

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

+0

Спасибо - но тогда кажется, что python не принимает скомпилированные версии. Попробуйте удалить .py-файлы и установить только с .pyx, он не сможет найти модули при их импорте (хотя установка идет без ошибок). Или вам всегда нужно хранить файлы .py? Как вы можете быть уверены, что он берет скомпилированную версию? Я видел это: http://stackoverflow.com/questions/6584457/what-is-the-precedence-of-python-compiled-files-in-imports, но так или иначе ... – schmi

+0

Хорошо, я этого не понимал. Я просто скопировал содержимое файла '.pyx'. Когда вы «cythonizing» файл '.py', нет необходимости хранить файл' .py'. Вы можете просто удалить его. –

 Смежные вопросы

  • Нет связанных вопросов^_^