Проблема с Cython, импортом модуля и Pickling

1

Я использую обычную генерацию генераторов случайных чисел с Cython. Я не понимаю, почему, но он больше не работает... Я думаю, это связано с Python 2.7 или, возможно, с новой версией Cython.

В dcmtrand.pyx у меня есть:

...
import dcmt
...
cdef class RandomState:
    ...
    def __reduce__(self):
        return (dcmt.__RandomState_ctor, (), self.get_state())
    ...

dcmt - это папка. В нем у меня есть файл init.py:

from dcmtrand import *

def __RandomState_ctor():
    return RandomState.__new__(RandomState)

Я скомпилирую его, используя

python setup.py build_ext --inplace

затем я копирую полученный файл dcmtrand.so в папку dcmt, и я перемещаю папку dcmt в свой проект.

Теперь, если я импортирую dcmt, все в порядке:

import dcmt
import cPickle
dc = dcmt.DynamicCreator(5)
a = dc[0]
cPickle.dumps(a)

Но если я хочу поместить dcmt в подпакет, он больше не работает:

from prng import dcmt

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "prng/dcmt/__init__.py", line 1, in <module>
    from dcmtrand import *
  File "dcmtrand.pyx", line 10, in init dcmtrand (dcmtrand.c:6955)
ImportError: No module named dcmt

Чтобы он работал, мне нужно добавить prng к пути Python.

Почему он больше не работает? Как заставить его работать снова?

Теги:
pickle
cython

1 ответ

2

Да, у вас есть 3 варианта:

  1. Установите PYTHONPATH, чтобы иметь dmct в нем: PYTHONPATH=$PYTHONPATH:prng
  2. Используйте sys.path:
    from os.path import dirname, join
    import sys
    sys.path.append(join(dirname(__file__), 'prng')
    
  3. Сделайте то же самое включение, что и в вашем.py: from prng import dcmt
  • 0
    Но почему это работало раньше? Что-то изменилось в том, как Python интерпретирует относительные пути?
  • 0
    100% ваша машинная среда изменилась, и некоторые глобальные переменные были обновлены / перезаписаны

Ещё вопросы

Сообщество Overcoder
Наверх
Меню