Я пытаюсь скомпилировать проект cyrand с использованием cython, но при запуске перегруженных конструкторов я запускаю причудливую ошибку компиляции. См. Это gist для файлов, о которых идет речь.Cython не распознает перегруженный конструктор
С сутью, я могу скомпилировать и запустить example.pyx просто отлично, который использует конструктор по умолчанию:
import numpy as np
cimport numpy as np
cimport cython
include "random.pyx"
@cython.boundscheck(False)
def example(n):
cdef int N = n
cdef rng r
cdef rng_sampler[double] * rng_p = new rng_sampler[double](r)
cdef rng_sampler[double] rng = deref(rng_p)
cdef np.ndarray[np.double_t, ndim=1] result = np.empty(N, dtype=np.double)
for i in range(N):
result[i] = rng.normal(0.0, 2.0)
print result
return result
^это работает и работает хорошо. Пример запуска производит следующий вывод:
$ python test_example.py [ 0.47237842 3.153744849 3.6854932057 ]
Но когда я пытаюсь скомпилировать и запустить тест, который используется конструктор, который принимает беззнаковое долго в качестве аргумента:
import numpy as np
cimport numpy as np
cimport cython
include "random.pyx"
@cython.boundscheck(False)
def example_seed(n, seed):
cdef int N = n
cdef unsigned long Seed = seed
cdef rng r
cdef rng_sampler[double] * rng_p = new rng_sampler[double](Seed)
cdef rng_sampler[double] rng = deref(rng_p)
cdef np.ndarray[np.double_t, ndim=1] result = np.empty(N, dtype=np.double)
for i in range(N):
result[i] = rng.normal(0.0, 2.0)
print result
return result
я получаю следующее Cython ошибка компилятора:
Error compiling Cython file:
-----------------------------------------------------------
...
cdef int N = n
cdef unsigned long Seed = seed
cdef rng_sampler[double] * rng_p = new rng_sampler[double](Seed)
----------------------------------------------------------
example/example_seed.pyx:15:67 Cannot assign type 'unsigned long' to 'mt19937'
Я расцениваю это сообщение, наряду с тем, что example.pyx компилирует и производит рабочий example.so
, этот cython не может найти (или управлять) конструктор rng_sampler, который принимает unsigned long как вход. Раньше я не использовал cython, и мой cpp в лучшем случае средний. Может ли кто-нибудь пролить свет на то, как исправить эту простую проблему?
питон: 2.7.10 (Anaconda 2.0.1) Cython: 0.22.1
Он, похоже, работает с Cython 0.21.1 (я только делал компиляцию с Cython, но не компиляцию с C++). Я подозреваю, что это ошибка, появившаяся в Cython 0.22.1, и, возможно, стоит сообщить об этом. – DavidW
@ DavidW: не могли бы вы разместить другие соответствующие настройки среды? После понижения до Cython 0.21.1 все еще встречаются те же ошибки. – LeeZamparo
@ DavidW: Спасибо за точку данных. После понижения до 0.21.1 я получил тот же результат. Затем я попробовал на другой машине, это сработало. Я попробовал обновить до 0,22.1, это сработало. Затем на оригинальной машине я установил другую версию boost, и она сработала. Таким образом, это оказалось проблемой с тем, как я установил boost:/ – LeeZamparo