Найти - Пользователи
Полная версия: Как подключить модуль на C при помощи cython?
Начало » Python для экспертов » Как подключить модуль на C при помощи cython?
1 2
StasShk
Здраствуйте!
Сразу прошу прощения за возможно нубский вопрос, я только начал осваивать программирование как таковое, питон знаю немного, С не знаю совсем. Вопрос поместил в “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)  
потом я создал setup.py:
 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)]
)
 
В результате компилятор выдал мне: longley.C: 29:19: Нет такого файла или каталога.
Собственно, что я делаю не так?
Shaman
Странно - у вас должна была выскочить совсем другая ошибка. Пока подсказка:
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++')]
)
и разбирайтесь далее, т.к. при текущем подходе ничего всё равно не заработает.
Sergei
сложновато будет, если и правда “только начали осваивать программирование как таковое”.
Попробуйте освоить 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, под которыми все это будет происходить.
StasShk
Sergei
вы под windows?
не, убунта
Shaman
Да, без знания C/C++ обойтись не получится.
AlexKhaizeman
Да, без C не очень комфортно будет. Вообще, cython может не выдать нужной скорости работы (зависит от алгоритма). Можно отдельно собирать библиотеки и подключать их. У меня большие проблемы вызывает разница в типизации языков
Olej
StasShk
Здраствуйте!Сразу прошу прощения за возможно нубский вопрос, я только начал осваивать программирование как таковое, питон знаю немного, С не знаю совсем. Вопрос поместил в “Python для экспертов” так как он кажется мне достаточно сложным.Я аспирант, занимаюсь исследование в области распространения радиволн. Сейчас я пытаюсь написать программу для проектирования и оптимизации эфирных сетей (радио, телевидение итд.). Одной из задач прип этом является расчет ослабления сигнала, для чего хочу использовать алгоритм Лонгли-Райса. Я нашел реализацию алгоритма на C: http://code.google.com/p/libprop/source/browse/trunk/longley.C и хотел бы иcпользовать его в своей программе именно в таком виде так как алгоримт довольно тяжелый и на питоне будет работать слишком медлено.Как я понял, cython позволяет подключать библиотеки на C в качестве модулей для питона.Я создал файл lr.pyx, прописал там:

StasShk, некоторые советы по многолетнему опыту программной разработки (и аспирантуры по распространению радиоволн тоже ):

1. Не занимайтесь “ранней оптимизацией” - пишите любой свой алгоритм на том основном инструменте, который используете (Python). Не угадывайте заранее “будет медленно - будет быстро”… И только тогда, когда а). отладите работу алгоритма + б). убедитесь, что производительности не хватает - переписывайте на оптимальных средствах (C или C++).

2. Посмотрите некоторые вопросы Python, в том числе и сопряжение с кодом C, вот здесь: Python и Осваиваем Python по-быстрому - там есть работающие примеры.
Может что-то подскажет…
Alen
Я нашел реализацию алгоритма на C: http://code.google.com/p/libprop/source/browse/trunk/longley.C

Боюсь вас огорчить, но это не C, a С++ . Думаю вас ввело в заблуждение расширение файла .C , в некоторых средах C++, принято исходники имено так именовать с большой “.C” в качестве расширения.

В результате компилятор выдал мне: longley.C: 29:19: Нет такого файла или каталога.

Ну правильно gcc не понимает include<complex> , вот если бы include <complex.h> тогда бы другое дело, правда всё остальное тоже бы пришлось переписывать.
Rodegast
> Как я понял, cython позволяет подключать библиотеки на C в качестве модулей для питона.

Нет. Cython позволяет транслировать код Python-а в C-код, а затем откомпилировать его как Python-модуль. Если нужно подключить модуль на C, то используй ctypes:

http://www.py-my.ru/post/50997be0bbddbd2f44000002
Shaman
Rodegast
Нет. Cython позволяет транслировать код Python-а в C-код, а затем откомпилировать его как Python-модуль.
Это далеко не все что позволяет Cython. Касаемо использования библиотек C тут.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB