Py_Initialize () не выполняется C DLL - PullRequest
       3

Py_Initialize () не выполняется C DLL

0 голосов
/ 11 сентября 2018

Я пытаюсь создать DLL на C, которая запускает некоторые сценарии Python для приложения. Я начал использовать Python 3.6 на VS10. DLL работала, но после того, как я перешел на ython 3.7, он просто остановился, когда вызывался Py_Initialize (). У меня есть папки DLL и Lib из python 3.7 в каталоге, требуемом моим приложением, а также DLL-библиотека python37, доступная для компоновки. Код показан ниже:

#include "python_headers/Python.h"
#include <string.h>
#include <stdio.h>

extern __declspec(dllexport) void __stdcall XMLGenerator(char* diagram)
{
    // Local variables
    FILE* log;
    char *pythonhome, *pythonpath, *pythonhome_bkp, *pythonpath_bkp;
    int size_pythonhome, size_pythonpath;
    PyObject *module, *function;

    log = fopen("Log.txt", "a");
    fprintf(log, "Entrou na DLL em C do tradutor.\n");
    fclose(log);

    // Save current values of Python environment variables
    pythonhome_bkp = (char*)malloc((strlen("PYTHONHOME=") + strlen(getenv("PYTHONHOME")) + 1) * sizeof(char));
    pythonpath_bkp = (char*)malloc((strlen("PYTHONPATH=") + strlen(getenv("PYTHONPATH")) + 1) * sizeof(char));
    strcpy(pythonhome_bkp, "PYTHONHOME=");
    strcat(pythonhome_bkp, getenv("PYTHONHOME"));
    strcpy(pythonpath_bkp, "PYTHONPATH=");
    strcat(pythonpath_bkp, getenv("PYTHONPATH"));

    // Set new values for Python environment variables
    size_pythonhome = strlen("PYTHONHOME=") + strlen(getenv("PYTHONHOME")) + strlen("/python");
    size_pythonpath = size_pythonhome + strlen("/Lib");
    pythonhome = (char*)malloc((size_pythonhome + 1) * sizeof(char));
    pythonpath = (char*)malloc((size_pythonpath + 1) * sizeof(char));
    strcpy(pythonhome, "PYTHONHOME=");
    strcat(pythonhome, getenv("PYTHONHOME"));
    strcat(pythonhome, "/python");
    strcpy(pythonpath, "PYTHONPATH=");
    strcat(pythonpath, getenv("PYTHONHOME"));
    strcat(pythonpath, "/python/Lib");
    putenv(pythonhome);
    putenv(pythonpath);
    log = fopen("Log.txt", "a");
    fprintf(log, "%s\n", pythonhome);
    fclose(log);
    log = fopen("Log.txt", "a");
    fprintf(log, "%s\n", pythonpath);
    fclose(log);
    free(pythonhome);
    free(pythonpath);

    // Initialize Python interpreter
    Py_Initialize();

    // Python imports
    PyRun_SimpleString("import sys; sys.path.append('.')");

    // Finalize Python interpreter
    Py_Finalize();

    // Reset Python environment variables
    putenv(pythonhome_bkp);
    putenv(pythonpath_bkp);
    free(pythonhome_bkp);
    free(pythonpath_bkp);
}

Этот код должен работать и работать на других компьютерах, кроме моего. У меня закончились идеи для решения этой проблемы.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...