我使用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
为了使它工作,我需要在Python路径中添加prng。
为什么它不再有效?如何让它再次运作?
答案 0 :(得分:2)
是的,你有3个选择:
PYTHONPATH=$PYTHONPATH:prng
from os.path import dirname, join import sys sys.path.append(join(dirname(__file__), 'prng')
from prng import dcmt