Sfml.pxd:

cdef extern from "SFML/Window.hpp" namespace "sf":

    cdef cppclass VideoMode:
        VideoMode(unsigned int, unsigned int) except +

    cdef cppclass Window:
        Window(VideoMode, String) except + 
        void display()

Display.pyx:

cimport sfml

cdef class Window:

    cdef sfml.Window* _this

    def __cinit__(self, unsigned int width, unsigned int height):

        self._this = new sfml.Window(sfml.VideoMode(width, height), "title")

    def __dealloc__(self):

        del self._this

    def display(self):

        self._this.display()

Setup.py :

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

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [
        Extension("display", ["display.pyx"],
        language='c++',
        libraries=["sfml-system", "sfml-window"])
    ]
)

Ошибка при запуске python setup.py build:

running build
running build_ext
cythoning display.pyx to display.cpp
Traceback (most recent call last):
  File "setup.py", line 10, in <module>
    libraries=["sfml-system", "sfml-window"])
  File "/usr/lib/python3.3/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/usr/lib/python3.3/distutils/dist.py", line 917, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python3.3/distutils/dist.py", line 936, in run_command
    cmd_obj.run()
  File "/usr/lib/python3.3/distutils/command/build.py", line 126, in run
    self.run_command(cmd_name)
  File "/usr/lib/python3.3/distutils/cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "/usr/lib/python3.3/distutils/dist.py", line 936, in run_command
    cmd_obj.run()
  File "/usr/lib/python3.3/site-packages/Cython/Distutils/build_ext.py", line 163, in run
    _build_ext.build_ext.run(self)
  File "/usr/lib/python3.3/distutils/command/build_ext.py", line 354, in run
    self.build_extensions()
  File "/usr/lib/python3.3/site-packages/Cython/Distutils/build_ext.py", line 170, in build_extensions
    ext.sources = self.cython_sources(ext.sources, ext)
  File "/usr/lib/python3.3/site-packages/Cython/Distutils/build_ext.py", line 317, in cython_sources
    full_module_name=module_name)
  File "/usr/lib/python3.3/site-packages/Cython/Compiler/Main.py", line 608, in compile
    return compile_single(source, options, full_module_name)
  File "/usr/lib/python3.3/site-packages/Cython/Compiler/Main.py", line 549, in compile_single
    return run_pipeline(source, options, full_module_name)
  File "/usr/lib/python3.3/site-packages/Cython/Compiler/Main.py", line 386, in run_pipeline
    from . import Pipeline
  File "/usr/lib/python3.3/site-packages/Cython/Compiler/Pipeline.py", line 7, in <module>
    from .Visitor import CythonTransform
  File "Visitor.py", line 10, in init Cython.Compiler.Visitor (/build/src/Cython-0.19/Cython/Compiler/Visitor.c:15987)
ImportError: No module named 'ExprNodes'

По-видимому, он не может найти что-то под названием ExprNodes, но я не думаю, что моя установка Cython сломана, потому что Некоторое время назад мне удалось успешно обернуть другую библиотеку C ++, и я не столкнулся с этой проблемой.

Я использую Cython 0.19.

Буду признателен за любую помощь / понимание, которое вы могли бы предложить.

Спасибо.

0
Goran Milovanovic 23 Май 2013 в 01:52
1
Сайт Cython утверждает, что он совместим с python 2.4–3.3, но недавно я столкнулся с аналогичными проблемами при компиляции расширения с 2.6.6 (+ Cython 0.18). При переходе на 2.7.5 это исправило. Так вы пробовали более раннюю версию python 3.X? Примечание: переключение между версиями Python может быть довольно простым в зависимости от формы пластины: stackoverflow.com/questions/13490351/…
 – 
Gauthier Boaglio
23 Май 2013 в 12:59
Кстати, есть ли у кого-нибудь указатели на настоящую совместимость версий Cython?
 – 
Gauthier Boaglio
23 Май 2013 в 13:07
ExprNodes - один из основных модулей Cython. Ваша установка Cython (или среда) не работает .
 – 
Nikita Nemkin
23 Май 2013 в 18:24
@Galgauth: Я бы предпочел выяснить ошибку и исправить ее, а затем вернуться к старой версии. Я имею в виду, что это то, что нужно будет сделать рано или поздно, так что с таким же успехом может быть и раньше. Верно?
 – 
Goran Milovanovic
23 Май 2013 в 23:03
Намекин: Ну, это не пропавший файл. То есть я вижу ExprNodes.py в /usr/lib/python3.3/site-packages/Cython/Compiler/. Это здесь. Кроме того, как уже отмечалось, я мог раньше обернуть другую библиотеку C ++ (с такой же точной настройкой), и у меня не было никаких проблем. Итак, я не понимаю, как вы можете быть так уверены, но если это действительно правда, то я хотел бы узнать подробности: как именно сломано, и как я могу это исправить?
 – 
Goran Milovanovic
23 Май 2013 в 23:17

1 ответ

Лучший ответ

При более внимательном рассмотрении трассировки я вижу, что Cython не работает внутри собственного скомпилированного кода. Это действительно может быть ошибка, извините, что пропустил ее в первый раз.

Что ты можешь сделать:

  • Создайте чистый virtualenv, установите туда Cython и проверьте, работает ли он. (Версия 0.19.1 самая последняя).
  • Создайте еще один virtualenv, но на этот раз установите Cython с помощью python setup.py install --no-cython-compile.

Если что-то из этого не помогло, опубликуйте свою подробную конфигурацию (дистрибутив и версия linux, версия python, версия gcc и т. Д.) В список рассылки cython-devel.

Кстати, ваш старый успешный проект все еще компилируется?

1
Nikita Nemkin 24 Май 2013 в 09:11
Первый virtualenv привел к той же ошибке. Второй virtualenv дал мне более подробную трассировку, которая находилась в файле с именем math.py, который фактически находился в том же каталоге, что и display.pyx. Я переименовал файл в m_math.py, а затем попробовал снова, и это сработало (сейчас у меня другие проблемы, но, по крайней мере, Cython работает). Итак, по сути, cython просто засосал локальный файл math.py ... Я не знаю, ошибка ли это, но в данном случае это была проблема. В любом случае спасибо за вашу помощь!
 – 
Goran Milovanovic
24 Май 2013 в 13:40
У меня есть сообщение Cython, где вы может дать представление о.
 – 
Phillip
1 Фев 2017 в 00:00