Я пишу код алгоритма в файлах Python и использую его в своем блокноте Jupyter, который находится в корне пути моего проекта кода. Я пытаюсь цитонизировать одну функцию python (из моих файлов python) и использовать ее в записной книжке Jupyter, но еще не преуспел в этом.
Я использовал cythonize -i для цитонизации моего конкретного исходного файла Python на месте; это действительно приводит к файлам .c и .so рядом с исходным исходным файлом. Итак, моя функция Python my_func находится в исходном файле foo/bar/my_func.py относительно домашнего каталога Jupyter, и теперь она успешно цитируется.
Исходный файл - это модуль нет, мне нравится функциональное программирование, поэтому я не тороплюсь создавать объекты и модули.
Затем у меня в записной книжке Jupyter:
%load_ext Cython
import sys, os
import pyximport
pyximport.install(reload_support=True)
sys.path.append(os.path.join(os.getcwd(),'foo', 'bar'))
Последняя строка выше действительно дает правильный полный путь к файлам cython в sys.path, в случае, если это необходимо для cython, даже если в этом не было необходимости для использования кода python до перехода к cython. Я не изменил способ импорта функции:
from foo.bar.my_func import my_funC# as my_func.py contains my function `my_func`
Но в моей следующей ячейке я пытаюсь использовать my_func внутри ячейки cython, и она не может загрузить мою функцию cython my_func, тогда как загрузка этой функции перед тем, как перейти к способу cython, который использовался для бесперебойной работы:
%%cython
.
.
.
def get_sameness_candidate(text):
for term in positive_terms:
term_distance_threshold = my_func(term, 5, 1.5)
.
.
.
cython не находит функцию:
cython_magic_5fb62d79423f13c25e1c53012d355e04.pyx:8:28: undeclared name not builtin: my_func
В дополнение к тому, что я не знаю, как это сделать, я счастлив узнать, как узнать, действительно ли оператор импорта загружает версию моего кода на cython или python, я не уверен, как сказать в общем случае .
Спасибо!
@DavidW Большое спасибо за указание на этот угол, теперь он работает без проблем :-) Я просто убедился, что импортировал свою функцию cython внутри ячейки %%cython, которая решила сообщение об ошибке, но на самом деле я не могу сказать, является ли моя ячейка теперь использую cython версию версии python my_func, чтобы подтвердить, что я действительно загружаю версию cython.
Сделайте print(type(my_func)) - это должно подтвердить, является ли это версия Cython или нет
@DavidW Вау, просто немыслимо :) и это ..... cython_function_or_method, вопрос решен. Хотели бы вы опубликовать упорядоченный ответ или оставить все хлопоты на меня? Я просто хотел бы опубликовать полностью рабочий пример кода, если этот вопрос находится здесь, на SO.
У меня нет особой мотивации писать ответ, поэтому смело делайте это сами :)





См. stackoverflow.com/questions/46223278/… - я не хочу отмечать ваш вопрос как дубликат, поскольку другой вопрос - гораздо худший вопрос, но ответ тот же: область видимости "global jupyter" не доступна автоматически в Cython, но вы можете импортировать отдельные символы с
from __main__ import my_func