Проблема с Cython, импортом модуля и Pickling - PullRequest
1 голос
/ 22 июня 2011

Я использую пользовательский генератор случайных чисел с 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.

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

1 Ответ

2 голосов
/ 07 июля 2011

Да, у вас есть 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
...