Я довольно новичок в python, который я всегда использую, написав скрипт в spyder и запустив его в консоли Ipython с python3.6.2.
Я пытаюсь написать простой модуль из файла "swig_example.c", следуя парам учебника по swig (http://www.swig.org/tutorial.html, http://www.swig.org/Doc1.3/Python.html#Python_nn6).
Моя цель - запустить скрипт "main_python.py", который должен выглядеть следующим образом:
import swig_test
print(swig_test.fact(4))
где факт - это функция, определенная в исходном источнике c.
Исходный файл "swig_example.c":
/* File: swig_example.c */
#include "swig_example.h"
int fact(int n) {
if (n == 0) {
return 1;
}
else {
return n * fact(n-1);
}
}
Файл заголовка так же прост:
/* File: swig_example.h */
int fact(int n);
и интерфейс один:
/* File: swig_example.i */
%module swig_test
%{
#include "swig_example.h"
%}
%include "swig_example.h"
Когда в терминале я запускаю:
swig -python swig_example.i
создаются файлы «swig_example_wrap.c» и «swig_test.py».
Как мне заставить мой "main_python.py" работать?
(Теперь он возвращает ошибку «Нет модуля с именем _swig_test»).
Я хотел бы иметь некоторый скрипт (возможно, использующий distutils?), Чтобы каждый раз, когда я изменял исходный код .c, я мог легко обновлять модуль без изменения файла "main_python.py".
Если у вас есть какое-либо решение, которое использует XCode вместо Spyder, оно будет хорошо принято.
Я думаю, что этот вопрос может быть полезен для многих новичков в python (и Mac на самом деле ...) и пытается использовать его, не выбрасывая свои предыдущие работы ...
EDIT:
Я частично решил проблему. Теперь главным пунктом остаются Spyder.
Я создаю файлы ".c", ".h" и ".i", как я описал. Затем, следуя этому сообщению ( Python.h не найден с помощью swig и Anaconda Python ), я создаю в той же папке мой файл «setup.py»:
from distutils.core import setup, Extension
example_module = Extension('_example', sources=['example.c','example.i'])
setup(name='example', ext_modules=[example_module], py_modules= .["example"])
Затем в anaconda navigator открываю терминал среды, в которой я работаю, перемещаюсь в нужную папку и запускаю:
python setup.py build_ext --inplace
Если сейчас я открою spyder, то все работает желаемым образом. Но если я теперь хочу изменить мой C-источник, скажем, добавить новую функцию, возникают проблемы. Я изменяю файлы ".c", ".h" и ".i" и затем повторно запускаю в терминале предыдущую строку. Результат файла «example.py» будет корректно изменен (в него не входит атрибут новой функции), но при попытке импортировать модуль в spyder (пример импорта) изменения не регистрируются и появляется сообщение об ошибке «_example не имеет атрибута» новая функция "дается в консоли Ipython, если я не перезагружаю сам Spyder.
Есть ли более быстрый способ исправить это? (возможно это взаимодействие упоминается в комментариях ...)
Спасибо всем: -)