2012-02-14 13 views
7

Używam Boost.Python do osadzenia interpretera w moim pliku wykonywalnym C++ i wykonania niektórych wstępnie napisanych skryptów. Mam to działa tak, że mogę wywoływać funkcje w pliku Pythona, ale kod Pythona, który chcę zaimportować pliki zewnętrzne i tych importów nie powiodło się, ponieważ "nie moduł o nazwie". Jeśli uruchomię skrypt bezpośrednio z Pythona, wszystko działa zgodnie z oczekiwaniami.W jaki sposób import działa z Boost.Python z wewnątrz plików Pythona

Moje pytanie brzmi: jaki jest prawidłowy sposób importowania modułów w skryptach Pythona uruchamianych przy użyciu wiązań C++?

C++ Kod:

#include "boost/python.hpp" 

int main(int argc, char** argv) 
{ 
    try 
    { 
    Py_Initialize(); 
    boost::python::object test = boost::python::import("__main__"); 
    boost::python::object testDict = test.attr("__dict__"); 
    boost::python::exec_file("test.py", testDict, testDict); 

    } 
    catch(boost::python::error_already_set& e) 
    { 
    PyErr_Print(); 
    } 
return 0; 

} 

kod Python:

import ModuleX 

Odpowiedz

12

Tak więc okazuje się, że mój problem jest prosty przypadek ścieżki wyszukiwania moduł nie jest prawidłowo ustawiony, gdy zainicjowane z poziomu C++.

From the Python Documentation intro:

W większości systemów (w szczególności na Unix i Windows, chociaż dane są nieco inne), Py_Initialize() oblicza ścieżkę moduł wyszukiwarki opartej na jego najlepszy przypuszczenie na temat lokalizacji standardowy plik wykonywalny interpretera Pythona, zakładając, że biblioteka Python jest znaleziona w ustalonej lokalizacji względem pliku wykonywalnego interpretatora Python . W szczególności szuka katalogu o nazwie lib/pythonX.Y względem katalogu nadrzędnego, w którym na ścieżce wyszukiwania poleceń powłoki znajduje się nazwany python (zmienna środowiskowa PATH ).

Oznacza to, że ścieżka wyszukiwania modułów nie jest w żaden sposób ustawiona na punkt w bieżącym katalogu roboczym, a raczej wskazuje na folder instalacyjny Pythona.

Rozwiązaniem było dla mnie prawidłowe ustawienie ścieżki wyszukiwania modułów tak, aby wskazywała na bieżący katalog roboczy. Aby to zrobić, musisz zainicjować pythona, a następnie wyodrębnić wartość sys.path i dodać dodatkowe ścieżki. Przepraszam za użycie boostu, jeśli tego nie robisz; powinieneś być w stanie łatwo zobaczyć, jak zastąpić dowolny pożądany ciąg.

+0

Dla Python3 zamień 'PyString_FromString' na' PyBytes_FromString' – schuess