LINUX.ORG.RU

[noob] C + ...

 


0

1

Я целях повышения кругозора и возможностей приложения интересуюсь способами вызова функций на языке <put_you_language_here> из программ на С. Гугления показало массу инфы на тему, как сделать наоборот (тот же SWIG).

Как вызвать Python-функцию из С-программы? Что можно сказать по поводу других языков?

C++ - добавить extern «C» в хедер

aho
()

для начала man 3 system, man 3 exec, man 3 dlopen

Corey
()

По Python можно посмотреть здесь http://docs.python.org/c-api/index.html

Еще видел подобное в книге Бизли - Python. Подробный справочник, там есть отдельная глава «ŸРасширение и встраивание интерпретатора Python».

hippi90 ★★★★★
()

i_am_programmer@linuks: cat > python_from.c
#include <pydoc>

Please give me secrete knowlege abpout «Embedding Python in Another Application».
return Thank you.

i_am_programmer@linuks: gcc python_from.c
i_am_programmer@linuks: python_from.a

#include <Python.h>

int
main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString(«from time import time,ctime\n»
«print 'Today is',ctime(time())\n»);
Py_Finalize();
return 0;
}

Shtucer
()

>Как вызвать Python-функцию из С-программы?

А никак. Программу на питоне не слинкуешь с программой на C ни динамически, ни статически, потому что программа на питоне не компилируется в объектный файл.

gentoo_root ★★★★★
()
Ответ на: комментарий от encyrtid

А использование плагина который требует интерпретатор не вызовет падения производительности?

Если плагин не рассчитан на постоянное использование.

+ нет необходимости в повышенной концентрации, при программировании на C.

+ возможность отредактировать плагин.

DarkAmateur ★★★★
() автор топика
Ответ на: комментарий от gentoo_root

>А никак. Программу на питоне не слинкуешь с программой на C ни динамически, ни статически, потому что программа на питоне не компилируется в объектный файл.

Скажи это Бендеру и Гимпу.

Shtucer
()
Ответ на: комментарий от hippi90

если нужно встраивать интерпретатор, то можно глянуть в сторону lua, поскольку он для этих целей и разрабатывался.

Corey
()
Ответ на: комментарий от Shtucer

Вызвать через CALL из C-программы функцию на питоне нельзя. Можно только породить процесс интерпретатора, чтобы он что-то делал.

gentoo_root ★★★★★
()
Ответ на: комментарий от DarkAmateur

А можно пример редко используемого плагина? И если понадобится писать часто используемый плагин, придется использовать С?

encyrtid ★★★★★
()

На python.org есть примеры как это сделать. Если коротко, то надо слинковаться с python.dll и вызвать несколько функций Сишного API.

Reset ★★★★★
()
Ответ на: комментарий от gentoo_root

Вызвать через CALL из C-программы функцию на питоне нельзя.

А через API питона можно.

Можно только породить процесс интерпретатора, чтобы он что-то делал.

Нафига отдельный процесс? Или ты имеешь ввиду system(«python ...»)?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

>Нафига отдельный процесс?

Я не знаю, что именно делает Py_Initialize(), но могу предположить, что порождает интерпретатор, иначе как ещё можно парсить питон?

Или ты имеешь ввиду system(«python ...»)?

Это как бы костыль, если есть <Python.h>.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

отдельный процесс не порождается

Reset ★★★★★
()
Ответ на: комментарий от gentoo_root

> Вызвать через CALL из C-программы функцию на питоне нельзя.

Близко к истине.

Можно только породить процесс интерпретатора, чтобы он что-то делал.

Далеко от истины.

tailgunner ★★★★★
()
Ответ на: комментарий от gentoo_root

Ты сам-то читать умеешь?

Можно только породить процесс интерпретатора, чтобы он что-то делал.

По ссылке видно, что это не так.

Shtucer
()
Ответ на: комментарий от gentoo_root

>Я не знаю, что именно делает Py_Initialize(), но могу предположить, что порождает интерпретатор, иначе как ещё можно парсить питон?

Все ясно.

Это как бы костыль, если есть <Python.h>.

Это после первого можно было не писать.

Shtucer
()
Ответ на: комментарий от gentoo_root

могу предположить, что порождает интерпретатор,

Интересная формулировка, и про процесс ничего не сказал, и якобы возразил.

иначе как ещё можно парсить питон

К сведению, для синтаксического анализа интерпретатор не нужен.

Begemoth ★★★★★
()
Ответ на: комментарий от Reset

>при чем тут ассемблер?

CALL — ассемблерная команда, я про неё говорил. Через CALL нельзя вызвать питонофункцию.

отдельный процесс не порождается

А как тогда интерпретатор питона работает в данном случае? Он в каком-нибудь *.so?

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

CALL — ассемблерная команда, я про неё говорил. Через CALL нельзя вызвать питонофункцию.

А кто просил её вызнать через CALL ? Это ты уже сам придумал.

А как тогда интерпретатор питона работает в данном случае?

В том же самом процессе где его вызвали/

Он в каком-нибудь *.so?

Да.

Reset ★★★★★
()
Ответ на: комментарий от Reset

>Это ты уже сам придумал.

Возможно, не спорю.

Да.

Тогда понятно. Чего-то сразу не подумал такой вариант.

gentoo_root ★★★★★
()

>Я целях повышения кругозора

Почему при отсутсвии образования и нежелании/неумении его получить, начинают вещать о «повышения кругозора»?

Led ★★★☆☆
()
Ответ на: комментарий от Led

>Почему при отсутсвии образования и нежелании/неумении его получить, начинают вещать о «повышения кругозора»?

Потому что, чтобы почувствовать разницу, нужно получить образование. А это уже рекурсия, а чтобы понять рекурсию, нужно получить образование. А это уже...

Shtucer
()
Ответ на: комментарий от Shtucer

Скажи это Бендеру

Бендер приблизительно через 988 лет только появится.

mv ★★★★★
()
Ответ на: комментарий от encyrtid

И если понадобится писать часто используемый плагин, придется использовать С?

Естественно.

А можно пример редко используемого плагина?

Мысль_с_ходу: анализатор логов на предмет какой-нить статистики и её визуализации. Не так шибко он тебе будет требоваться, чтобы это сказывалось на производительности всей системы, и чтобы корячиться графики на C рисовать.

DarkAmateur ★★★★
() автор топика
Ответ на: комментарий от Led

Почему при отсутсвии образования и нежелании/неумении его получить...

... такие вопросы вообще не задают.

Google вещь хорошая, но вдруг в кеше чьего-нить мозга завалялась какая-нибудь полезная информация, нележащая на поверхности. Никогда не учили: «если что, лучше спросить у коллеги [, если он не занят]»?

DarkAmateur ★★★★
() автор топика
Ответ на: комментарий от gentoo_root

> А как тогда интерпретатор питона работает в данном случае? Он в каком-нибудь *.so?

И даже в *.a

tailgunner ★★★★★
()
Ответ на: комментарий от DarkAmateur

>Никогда не учили: «если что, лучше спросить у коллеги [, если он не занят]»?

Всё верное: зачем что-то учить, как лох, когда можно, как нормальный пацан, списать на экзамене?

Led ★★★☆☆
()
Ответ на: комментарий от gandjubas

И ещё есть некий Cython или как-то так, который якобы генерит C код из питона - вот можно так ещё. После генерации находишь свои функции делаешь их доступными для вызова внешней программы, а питон-С код компилишь в длл-ку.

gandjubas
()
Ответ на: комментарий от gandjubas

> 2. выделяем куски тормозного кода и переписываем их на С

Или даже переписываем их в виде, пригодном для ShedSkin.

tailgunner ★★★★★
()

Вообще то наоборот (т.е. когда питон ведущий и из него вызываются ф-ии на С, фортране и проч) ИМНО куда естественней. Все таки питон для верхнего управляющего уровня подходит ИМНО куда лучше чем С/C++, а C/C++ куда лучше подходит для написания чего то быстроработающего имеющего вид библиотеки.

AIv ★★★★★
()

Почему бы ТСу не погуглить в сторону языка Lua?

anonymous
()
Ответ на: комментарий от true_admin

Написать функцию на Си, делающую это, и вызвать её из lua. Другой вариант - через lua распарсить системные файлы, в которых хранится hostname.

anonymous
()
Ответ на: комментарий от anonymous

этого я и боялся и поэтому(а ещё за дурацкий синтаксис коментариев) не хочу lua :(.

Мне это нужно было для awesome. Я использую один конфиг на кучи тачек. Но, вот беда, на одних ноутах батарейка это BAT0, на других BAT1, а на третьих BAT0 и BAT1, но работает только BAT0. Вот я и хотел по hostname захардкодить на каком ноуте какая батарейка.

Наверно решу через system(«hostname») :(

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> system(«hostname»)

Тоже вариант. Я Lua мало использую, потому о таком варианте забыл.

anonymous
()
Ответ на: комментарий от true_admin

Мне это нужно было для awesome. Я использую один конфиг на кучи тачек. Но, вот беда, на одних ноутах батарейка это BAT0, на других BAT1, а на третьих BAT0 и BAT1, но работает только BAT0. Вот я и хотел по hostname захардкодить на каком ноуте какая батарейка.

А пройтись по списку и нельзя?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

В смысле все батарейки попробовать? Так придётся ещё и файлы парсить. С моими нулевыми познаниями lua это вообще труба. Короче, через io.popen сделал.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> В смысле все батарейки попробовать? Так придётся ещё и файлы парсить. С моими нулевыми познаниями lua это вообще труба. Короче, через io.popen сделал.

Ну да, пробежаться по списку один раз, запомнить нужный индекс или путь и работать уже с ним.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.