Форум сайта python.su
Здраствуйте!
Сразу прошу прощения за возможно нубский вопрос, я только начал осваивать программирование как таковое, питон знаю немного, С не знаю совсем. Вопрос поместил в “Python для экспертов” так как он кажется мне достаточно сложным.
Я аспирант, занимаюсь исследование в области распространения радиволн. Сейчас я пытаюсь написать программу для проектирования и оптимизации эфирных сетей (радио, телевидение итд.). Одной из задач прип этом является расчет ослабления сигнала, для чего хочу использовать алгоритм Лонгли-Райса. Я нашел реализацию алгоритма на C: http://code.google.com/p/libprop/source/browse/trunk/longley.C и хотел бы иcпользовать его в своей программе именно в таком виде так как алгоримт довольно тяжелый и на питоне будет работать слишком медлено.
Как я понял, cython позволяет подключать библиотеки на C в качестве модулей для питона.
Я создал файл lr.pyx, прописал там:
cdef extern from "longley.C": ctypedef void point_to_point(double elev[], double tht_m, double rht_m, double eps_dielect, double sgm_conductivity, double eno_ns_surfref, double frq_mhz, int radio_climate, int pol, double conf, double rel, double &dbloss, char *strmode, int &errnum)
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourcefiles = ['lr.pyx', 'longley.C'] setup( cmdclass = {'build_ext': build_ext}, ext_modules = [Extension("lr", sourcefiles)] )
Отредактировано StasShk (Июнь 20, 2013 06:50:15)
Офлайн
Странно - у вас должна была выскочить совсем другая ошибка. Пока подсказка:
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourcefiles = ['lr.pyx'] setup( cmdclass = {'build_ext': build_ext}, ext_modules = [Extension("lr", sourcefiles, language='C++')] )
Офлайн
сложновато будет, если и правда “только начали осваивать программирование как таковое”.
Попробуйте освоить boost. Упрощенно - это библиотека расширений c. Одно из них называется boost::python и решает задачу как раз interoperability между с и python, здесь http://www.boost.org/doc/libs/1_53_0/libs/python/doc/index.html
Чтобы сразу понять, каков будет результат, гляньте здесь, с точки зрения питона:
http://wiki.python.org/moin/boost.python
Сразу в раздел Tutorial.
Грубо, boost позволяет как из питона вызывать реализованный в c код, так и наоборот. Вас интересует первый вариант. С точки зрения кода, весь workflow несложный:
пример здесь http://wiki.python.org/moin/boost.python/SimpleExample
- у вас есть c-шный API, который вам нужно заэкспозить в питон
- пишете простую прокладку, маппинг нужных API вызовов
- при компиляции получите модуль (вы под windows? тогда это будет файл с расширением .pyd), из которого сможете вызывать и обращаться к вашему c API
Предсказываю, что самые большие сложности будут как раз не с программированием, а именно с тем, чтобы собрать конфигурацию, которая скомпилируется нормально под тем компилятором и OS, под которыми все это будет происходить.
Офлайн
Sergeiне, убунта
вы под windows?
Офлайн
Да, без знания C/C++ обойтись не получится.
Офлайн
Да, без C не очень комфортно будет. Вообще, cython может не выдать нужной скорости работы (зависит от алгоритма). Можно отдельно собирать библиотеки и подключать их. У меня большие проблемы вызывает разница в типизации языков
Офлайн
StasShk
Здраствуйте!Сразу прошу прощения за возможно нубский вопрос, я только начал осваивать программирование как таковое, питон знаю немного, С не знаю совсем. Вопрос поместил в “Python для экспертов” так как он кажется мне достаточно сложным.Я аспирант, занимаюсь исследование в области распространения радиволн. Сейчас я пытаюсь написать программу для проектирования и оптимизации эфирных сетей (радио, телевидение итд.). Одной из задач прип этом является расчет ослабления сигнала, для чего хочу использовать алгоритм Лонгли-Райса. Я нашел реализацию алгоритма на C: http://code.google.com/p/libprop/source/browse/trunk/longley.C и хотел бы иcпользовать его в своей программе именно в таком виде так как алгоримт довольно тяжелый и на питоне будет работать слишком медлено.Как я понял, cython позволяет подключать библиотеки на C в качестве модулей для питона.Я создал файл lr.pyx, прописал там:
Офлайн
Я нашел реализацию алгоритма на C: http://code.google.com/p/libprop/source/browse/trunk/longley.C
В результате компилятор выдал мне: longley.C: 29:19: Нет такого файла или каталога.
Офлайн
> Как я понял, cython позволяет подключать библиотеки на C в качестве модулей для питона.
Нет. Cython позволяет транслировать код Python-а в C-код, а затем откомпилировать его как Python-модуль. Если нужно подключить модуль на C, то используй ctypes:
http://www.py-my.ru/post/50997be0bbddbd2f44000002
Офлайн
RodegastЭто далеко не все что позволяет Cython. Касаемо использования библиотек C тут.
Нет. Cython позволяет транслировать код Python-а в C-код, а затем откомпилировать его как Python-модуль.
Офлайн