Форум сайта python.su
Использую boost.python пару часов, а уже возникла куча проблем. Я хочу запустить такой скрипт из файла:
from sys import version
print 'Hello World !'
number = 42
print number
print sys.version
File "script.py", line 5, in <module>
from sys import version
ImportError: __import__ not found
void exec_file_test(std::string const &script)
{
std::cout << "running file " << script << "..." << std::endl;
// Run a python script in an empty environment.
python::dict global;
python::object result = python::exec_file(script.c_str(), global, global);
// Extract an object the script stored in the global dictionary.
BOOST_TEST(python::extract<int>(global["number"]) == 42);
std::cout << "success!" << std::endl;
}
Офлайн
Нужно
1. Инициалицировать python Py_Initialize()
2. Сделать __main__ module (хотя бы пустой)
Далее замечание не совсем по теме.
После многолетнего использования boost.python пришло понимание, что нужно делать C extensions, которые отлично живут в обычном питоне. Т.е. extending и никак не embedding.
На заключительном этапе разработки все это счастье заворачивается py2exe или самописным запускачом.
Вариант с изначальным embedding труднее (медленней) писать и значительно трудней отлаживать. И вообще количество питоновского кода превосходит объем плюсов как минимум в пять раз (это для проектов с интенсивным использованием C++, чаще - больше).
Все что можно пишется на питоне. На С++ пишется то, что на питоне сделать нельзя.
Офлайн
Андрей Светлов, спасибо за ответ
но мне нужен именно embedding, т.к. мне необходимо в С++-щной программе подключение пользовательских скриптов(т.е. выполнение их в определенный момент)
Сделать __main__ module (хотя бы пустой)
а как это сделать?
Офлайн
Передо мной, кстати, такая же задача стоит, которую придется решать в ближайшем будущем.
Так что буду с интересом следить за веткой :-).
Раньше я её с успехом решал имея на руках компилятор Pascal (FreePascal, Delphi) и API CPython, но с boost еще не работал, да и по C++ опыт маленький.
..bw
Офлайн
bw
а API CPython разве не только под С\C++?
Отредактировано (Июнь 4, 2009 23:00:49)
Офлайн
Свет клином на C/++ не сошелся :-). API к интерпретатору Python, заключённому в динамическую библиотеку, либо исполненному как статический код, везде одинаковый. Хоть D, хоть ctypes используй.
Но это уже offtopic.
..bw
Офлайн