Я новичок в Cython и просто пытаюсь поэкспериментировать с простым скриптом. Я не могу импортировать функцию из модуля и использовать ее в другом файле, но если я объявляю функцию в том же файле, она работает просто отлично. В чем может быть проблема здесь. Я что-то упустил?
Это оригинальный фрагмент кода (test_cy.pyx):
# test_cy.pyx
import json
cpdef char* say_hello():
message = json.dumps({"message": "Hello world"})
return message.encode()
cdef char* fn(int n):
cdef char* hello = say_hello()
return hello
def test():
cdef char* n = fn(1000)
print(n)
Я могу запустить его как (После компиляции):
>>> import test_cy
>>> test_cy.test()
b'Hello world'
Однако, если я перенесу функцию say_hello в другой файл (utils.pyx):
# utils.pyx
import json
cpdef char* say_hello():
message = json.dumps({"message": "Hello world"})
return message.encode()
... и импортирую ее в мой оригинальный файл test_cy.pyx, например, так:
# test_cy.pyx
from utils import say_hello
cdef char* fn(int n):
cdef char* hello = say_hello()
return hello
def test():
cdef char* n = fn(1000)
print(n)
Я не могу его скомпилировать, так как получаю следующую ошибку:
>>> python3 setup.py build_ext --inplace
...
Error compiling Cython file:
------------------------------------------------------------
...
from utils import say_hello
cdef char* fn(int n):
cdef char* hello = say_hello()
^
------------------------------------------------------------
test_cy.pyx:4:7: Storing unsafe C derivative of temporary Python reference
Traceback (most recent call last):
File "setup.py", line 11, in <module>
sources=["utils.pyx"]
File "/Users/asim/.pyenv/versions/3.6.9/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 1101, in cythonize
cythonize_one(*args)
File "/Users/asim/.pyenv/versions/3.6.9/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 1224, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: test_cy.pyx
Вот мой файл setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(
ext_modules = cythonize([
Extension("test_cy",
sources=["test_cy.pyx"]
),
Extension("utils",
sources=["utils.pyx"]
)
])
)
Пожалуйста, помогите мне как-нибудь так просто например, импорт функции из другого модуля не должен быть таким сложным. Я мог бы пропустить что-то тривиальное. Спасибо!