Py_Initialize()不由C DLL执行

时间:2018-09-11 17:20:28

标签: c python-3.x dll

我试图在C中创建一个DLL,该DLL为应用程序运行一些python脚本。我开始在VS10上使用python 3.6。该DLL可以正常工作,但是在我更改为ython 3.7之后,它就停止了运行,就在刚调用Py_Initialize()时。我的应用程序需要在目录上有python 3.7格式的DLL和Lib文件夹,并且还具有可用于链接的python37 DLL。代码如下所示:

#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);
}

该代码应该可以在除我以外的其他计算机上正常工作。我没有解决这个问题的想法。

谢谢!

0 个答案:

没有答案