Модуль для python3.6.2 (среда Spyder) из исходного кода c - PullRequest
0 голосов
/ 06 января 2019

Я довольно новичок в 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.

Есть ли более быстрый способ исправить это? (возможно это взаимодействие упоминается в комментариях ...)

Спасибо всем: -)

...