![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
рассмотрим самый простой пример
как мне вызвать этот код? из с++? т.е. я должен получить что то типа код C++
документацию пробовал читать, но что то там сложно и непонятно понадобится ли интерпретатор питона конечной программе? |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
разумеется. это тут не при чем. boost.python делает обратное. т.е. код написанный на С/С++ позволяет использовать в пайтон. читай это: http://docs.python.org/extending/embedding.html ну мегапростое решение.
Это сообщение отредактировал(а) boostcoder - 27.4.2012, 13:50 |
||||
|
|||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну я про что то типа py2exe, т.е. не надо ставить интерпретатор на другой машине, где потом будет запускаться программа. т.е. что я примерно хочу это взять и каким либо образом запаковать мои .py файлы и нужное для них из интерпретатора в .lib и затем в мою с++ программу только подключить либу и заголовок с описанием класса с функциями или просто функций. и потом из кода вызывать примерно так
ну или без класса, а просто функцию вызвать.
ну так и что будет являться результатом этой операции? мне то надо, как я писал выше, аргументы передать в с++ функцию и результат из неё получить, а тут как я понял просто строка интерпретатору отсылается на выполнение? Это сообщение отредактировал(а) mrgloom - 27.4.2012, 14:13 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ссылку читай. там показано как из плюсов передавать аргументы в пайтон, и получать результаты обратно.
|
|||
|
||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
да, понял. секция 5.3.
хмм получается что для каждого типа возвращаемого значения надо будет написать свою функцию? call_python_func(char* module,char* func_name) или можно как то на месте узнавать тип возвращаемого значения? да и буст похоже умеет это делать в обе стороны http://stackoverflow.com/questions/215752/...ata-back-to-cpp пытаюсь переписать с примера, но непонятно как передаются параметры просто в строке через пробел?
вот нашел еще пример, но тут опять же никаких значений не передается и не возвращается.
|
||||
|
|||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
вроде разобрался, но все равно не работает.
на питоне файл
пишет что не может найти myadd |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
покажи какое именно сообщение пишет. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Еще вот что заметил
это не правильно Если вы хотите передать 2 дабла, то
Добавлено через 5 минут и 4 секунды http://docs.python.org/release/1.5.2/ext/buildValue.html |
||||
|
|||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
да спасибо, так работает, протестировал пока правда только на простой функции, а не на реальных файлах.
но все таки придется писать для каждого типа возвращаемого значения свою функцию? и еще вопрос о прикручивании питона внутрь, наивным методом пока остановился вот на чем. если собрать .exe с вышеобозначенным кодом и перенести на другой компьютер, то пишет python.dll не найден, ну доложил в папку dll и теперь пишет ImportError: No module named site. дальше пока не знаю что делать. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
потому что интерпретатор должен знать где лежит директория lib с библиотеками пайтона. по умолчанию, он ищет ее в той же директории где лежит python.dll. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
скопировал папку Lib, где находятся все .py теперь всё работает, я так понимаю что мне достаточно оставить в папке только те .py файлы которые вызывает моя программа?
и еще вопрос запаковать в .exe сразу это все сразу нельзя? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
а как быть, если у меня класс и надо обратится к методу класса? (в примере myadd3)
Это сообщение отредактировал(а) mrgloom - 28.4.2012, 12:24 |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
хмм но теоретически даже если не получится вызывать метод класса, то наверно можно все self переменные сделать глобальными класс убрать и просто сделать список функций или я не вижу каких то подводных камней?
Это сообщение отредактировал(а) mrgloom - 28.4.2012, 13:03 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
не вкурсе.
мало работал с встраиванием пайтоновского интерпретатора в С/С++ |
|||
|
||||
| mrgloom |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
пробую минимальный код, пишет что нет модуля path ("no module named path") причем из интерпретатора все работает. Добавлено через 14 минут и 19 секунд причем так работает
но при попытке импортировать socket пишет, пишет что нету _socket.
|
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
по идее, это должно помочь: http://docs.python.org/c-api/init.html#Py_SetPythonHome
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
попробовал указать в Py_SetPythonHome папку со скриптами, там же где лежит солюшн, и ничего.
вообщем проблема как тут http://www.linuxquestions.org/questions/pr...et-mess-699794/ http://bytes.com/topic/python/answers/8031...d-python-script только переустановка мне не помогла. что интересно, я заметил, что не находит _socket даже, если положить в папку со скриптами python.exe python27.dll и папку Lib, т.е. что то с путями всё таки скорее всего. так же пробовал кидать _socket.pyd куда угодно, не находит. полезный документ нашел https://www6.software.ibm.com/developerwork...nscript-ltr.pdf Это сообщение отредактировал(а) mrgloom - 28.5.2012, 15:57 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это все же не раздел по пайтон девелопмингу. лучше подобные специфичные вещи спрашивать в списке рассылки конкретного проенкта.
но, т.к. ты юзаешь boost.python, спроси в списке рассылки [email protected]. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
это я в начале хотел использовать, а сейчас пользуюсь встроенными питоновскими как в pdf выше, только проблема с _socket осталась.
скорее всего потому что _socket.pyd лежит не в Lib,а в Dlls. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а зачем эта pdf`ка если в оффю доке написано тоже самое? ;) к тому же, этой теме тем более не место в этом разделе. пиши девелоперам. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну вообщем я продолжу поиски решения или обходные пути.
кстати с помощью Py2exe из скрипта я так понимаю можно сделать dll, но как потом к ней обращаться?(особенно если есть входные параметры и выходные) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
слушай.. а какая цель у твоей задачи? писать на пайтон и прикидываться нативной?
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
у меня есть код на питоне(который я не хочу переписывать на с++) и есть приложение на с++ в которое я хочу встроить данный функционал.
вообщем мне надо из с++ кода вызывать python код, не просто запускать скрипт, а написать как бы обертки для функций на питоне+чтобы можно было подавать и возвращать параметры. в pdf вроде даже написано как вызывать метод класса, я до этого просто функции пробовал. причем в release даже вроде работает(хотя может просто не пишет ошибку), а в дебаге я застрял с этим import socket. попробую еще python portable может прокатит. |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
вроде бы решение -E флаг для GCC, но какой аналог для линкера студии? если важно, я линкую статически.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
этот флаг, говорит gcc запуститься в режиме препроцессора-only. так что непонятно, какое это имеет отношение к проблеме) |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
похоже, то что выше относится к этому.
http://docs.python.org/extending/embedding...ng-requirements хотя я не очень себе представляю как там эта линковка происходит, тем более что тут описывается для линукса, и во всяком случае distutils.sysconfig.get_config_var('LINKFORSHARED') мне не выдал ни одного флага. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
что к чему относится? препроцессор к клинковке? |
|||
|
||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
может вы не так поняли(ну или я ), там скорее
по описанию делает
вот наверно надо найти аналог для линкера VS. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
что делает эта опция - я знаю. но это же вы написали: потому я и спрашиваю, какое отношение имеет препроцессор к линковке? |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну никакого, я смотрел в каком то справочнике и там было -Е а в низу расшифровка -export-dynamic, видимо это была не расшифровка, а просто алфавитный указатель.
так это актуально для виндоус? или это относится только к .so файлам? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хз-хз..
а проверить не судьба? |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну так я не знаю какой аналог для линкера VS(в линковке не особо разбираюсь), а на GCC конечно можно проверить, но у меня главный проект завязан на MFC и даже если я всё связанное с питоном выделю в dll, то я так понимаю всё равно будут проблемы при подключении к главному проекту.
вообще я так понял, что когда пытаешься вызвать import socket из кода на c++, там внутри идет вызов _socket для которого есть dll _socket.pyd и _socket.lib и они не находятся, я пробовал пихать _socket.lib прямо в проект VS, но ничего не выходит. Это сообщение отредактировал(а) mrgloom - 30.5.2012, 09:53 |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
странно, не пойму что сделал, но теперь в релиз версии импорт .pyd идет нормально, зато падает на PyRun_SimpleFile, но только при попытке выполнения .py скрипта, который содержит ссылку на .pyd.
дебаг версия не работает с .pyd файлами, хотя возможно это и не удивительно, т.к. это же с-шные длл-ки, наверно собранные в релиз версии. Это сообщение отредактировал(а) mrgloom - 30.5.2012, 11:24 |
|||
|
||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
решил писать обертку не для всех функций, а только для тех которые возвращают значение.
не пойму как сделать отступы
так не работает
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
смотри пример в первом моем посте.
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
пытаюсь с помощью sprintf подменить параметры в скрипте.
что не так? Это сообщение отредактировал(а) mrgloom - 31.5.2012, 16:26 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mrgloom,
во-первых - ты что, решил в одной теме задать все интересующие тебя вопросы? правило: одна тема - один вопрос. во-вторых - ты же на плюсах пишешь и в проекте у тебя используется буст. к чему эти извраты с сями?
http://liveworkspace.org/code/782a0449599b...c278ef60628e767 |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
хмм там скорее всего какой то сайд эффект от sprintf.
возник еще один вопрос, как контролировать выполнилась ли строчка кода или нет? ну допустим, если разработчиком питон кода сделано так, что функция скажем возвращает 0 или 1 в зависимости от того выполнилась или нет, то можно просто получать это возвращаемое значение. а если это не предусмотрено? теортетически даже непонятно, чт ов консоль питона должно вывестись. а если чего то не хватает, как у меня было с import _socket или еще какая ошибка? тем более вообще не понятно можем ли мы как то отслеживать, что выводится в консоль питона. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Модератор: Пожалуйста, один топик - один вопрос.
mrgloom, создай новую тему для нового вопроса. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |