Почему происходит сбой Python / C API на PyRun_SimpleFile?

Я экспериментировал со встраиванием разных языков сценариев в приложение C ++, в настоящее время я пробую Stackless Python 3.1. Я пробовал несколько руководств и примеров, которые мне удалось найти, чтобы попробовать запустить простой скрипт из приложения.

Py_Initialize();

FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
    fclose(PythonScriptFile);
}

Py_Finalize();

По какой-то странной причине выполнение этого фрагмента кода приводит к нарушению доступа по адресу:

    PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");

I Я искал в Интернете других людей с похожей проблемой и нашел только один. Их единственным решением было обходное решение, которое кажется возможным только в более старой версии Python: Создание файлового объекта python и возврат FILE * из этого файлового объекта python в PyRun_SimpleFile . Однако такие вызовы функций недоступны, API Python 3.1 создает файловые объекты из файлового дескриптора и возвращает файловые дескрипторы, но функции PyRun_SimpleFile по-прежнему требуется FILE * .

I Я не понимаю, как запускать какие-либо сценарии из файла, за исключением загрузки всего файла в память вручную и запуска его как гигантской строки, что, конечно, не является практическим решением.

Что дает? Как я могу выполнить эту задачу, если в API есть внутренняя ошибка?

Обновление: но функция PyRun_SimpleFile по-прежнему требует FILE * .

Я не понимаю, как запускать любые скрипты из файла, кроме загрузки всего файла в память вручную и запускать его как гигантскую струну, конечно, не практическое решение.

Что дает? Как я могу выполнить эту задачу, если в API есть внутренняя ошибка?

Обновление: но функция PyRun_SimpleFile по-прежнему требует FILE * .

Я не понимаю, как запускать любые скрипты из файла, кроме загрузки всего файла в память вручную и запускать его как гигантскую струну, конечно, не практическое решение.

Что дает? Как я могу выполнить эту задачу, если в API есть внутренняя ошибка?

Обновление: Мне удалось собрать Stackless Python 3.1 из исходников, но сбой остался полностью неизменным, несмотря на использование той же библиотеки времени выполнения C. И мой проект, и исходный код Stackless Python 3.1 созданы с помощью компилятора C ++ Visual Studio 2010 и среды выполнения C. Я больше не имею ни малейшего представления о том, что могло бы решить эту проблему, за исключением модификации Python для использования имени файла, а не FILE *. Еще один ужасный обходной путь.

13
задан Mike Pennington 24 November 2011 в 15:39
поделиться