Rozwijam się w systemie Windows, i szukałem wszędzie, nie znajdując nikogo, kto mówiłby o takich rzeczach.C++ z osadzaniem w Pythonie: awaria, jeśli Python nie jest zainstalowany
Stworzyłem aplikację C++ na moim komputerze stacjonarnym, w której osadzono Python 3.1 przy użyciu MSVC. Połączyłem python31.lib i uwzględniłem python31.dll w folderze uruchomionym aplikacji obok pliku wykonywalnego. Działa świetnie. Mój kod rozszerzenia i osadzania zdecydowanie działa i nie ma żadnych awarii.
Wysłałem folder run do mojego znajomego, który nie ma zainstalowanego Python, a aplikacja ulega awarii podczas fazy instalacji skryptów.
Kilka godzin temu wypróbowałem aplikację na moim laptopie z zainstalowanym Pythonem 2.6. Miałem takie samo zachowanie awaryjne jak mój przyjaciel, a poprzez debugowanie okazało się, że to nie było wywołanie Py_Initialize().
Zainstalowałem Python 3.1 na moim laptopie bez zmiany kodu aplikacji. Uruchomiłem to i działa idealnie. Odinstalowałem Python 3.1, a aplikacja ponownie się zawiesi. Wstawiłem kod w mojej aplikacji, aby dynamicznie łączyć się z lokalnym python31.dll, aby upewnić się, że go używa, ale nadal dostaję awarię.
Nie wiem, czy interpreter potrzebuje więcej niż DLL, aby uruchomić lub co. Nie byłem w stanie znaleźć żadnych zasobów na ten temat. Dokumentacja Pythona i inne przewodniki nie wydają się jak dotąd rozwiązywać kwestii rozpowszechniania aplikacji C/C++, które używają osadzania w Pythonie bez konieczności instalowania Pythona lokalnie. Wiem, że jest to bardziej problem w systemie Windows niż w systemie Unix, ale widziałem wiele aplikacji Windows C/C++, które lokalnie lokują Python i nie jestem pewien, jak to robią.
Czego jeszcze potrzebuję poza biblioteką DLL? Dlaczego działa po zainstalowaniu Pythona, a następnie przestaje działać po jego odinstalowaniu? Wygląda na to, że powinno być tak trywialnie; może dlatego nikt tak naprawdę nie mówi o tym. Niemniej jednak nie mogę wyjaśnić, jak sobie z tym problemem poradzić.
Dziękuję bardzo z góry.
Czy wywołanie funkcji loadbiblioteka zakończyło się pomyślnie? Gdzie umieszczasz bibliotekę dll? Może to być tak proste, jak aplikacja nie może znaleźć biblioteki. – patros
LoadLibrary powiodło się, podobnie jak GetProcAddress. Ponieważ mam ten sam wyjątek, co ja bez dynamicznego łącza (a nie z powodu naruszenia dostępu NULL), mam wrażenie, że Py_Initialize zostało wywołane. Biblioteka DLL znajduje się w katalogu uruchomień. Mój katalog uruchamiania zawiera:. \ Ss_server.exe,. \ Python31.dll,. \ Admin.sqlite,. \ Settings.py,. \ Err.txt – apostrophest