执行脚本使用 C++ 中的 pywin32第1693章

问题描述

我在我的 C++ 应用程序中使用带有静态链接的 python39,并使用 win32pipe 和 win32file 调用 python 脚本。每次运行我都会强制执行一个错误 ImportError: DLL load failed while importing win32file: The specified module could not be found.. 模块的所有路径都是通过 PyConfig 配置的,所以它看起来像

        wchar_t* filename = Py_DecodeLocale(argv[0],nullptr);
        auto pySysPath = _getPySysPath();

        std::wstring pathVar = pySysPath;
        const wchar_t* path = _wgetenv(L"PATH");
        if (path) {
            pathVar += path;
        }

        Py_SetPath(pathVar.c_str());
        Py_SetPythonHome(_wgetenv(L"PYROOT"));
        Py_SetProgramName(filename);

        PyConfig pyConfig;
        PyConfig_InitIsolatedConfig(&pyConfig);
        PyConfig_SetBytesArgv(&pyConfig,argc,argc ? argv : nullptr);
        PyConfig_SetString(&pyConfig,&pyConfig.pythonpath_env,pySysPath.c_str());
        PyConfig_SetString(&pyConfig,&pyConfig.program_name,pyProgramName);
        Py_DebugFlag = true;
        pyConfig.isolated = false;
        pyConfig.dev_mode = true;
        pyConfig.verbose = 2;
        pyConfig.parse_argv = true;
        pyConfig.dev_mode = true;
        pyConfig.use_environment = true;
        pyConfig.write_bytecode = true;

        auto status = Py_InitializeFromConfig(&pyConfig);
        if (PyStatus_Exception(status)) {
            Py_ExitStatusException(status);
        }

我从 _getPySysPath() 生成的路径使用这个:

    static const std::vector<const wchar_t*> _pySysPathes = {
            L"Lib\\site-packages\\pywin32_system32",L"Lib\\site-packages\\win32",L"Lib\\site-packages",L"python39.zip",L"DLLs",L"lib",L"lib\\site-packages",L"lib\\site-packages\\win32",L"lib\\site-packages\\win32\\lib",L"lib\\site-packages\\Pythonwin"};

尽管有错误,但我使用 python3.9 时没有错误,它已从官方网站作为二进制文件安装在我的系统上。

附言 详细级别 2 告诉我 _find_and_load 中发生错误,但它什么也没告诉我。 完整回溯:

# code object from 'C:\\Users\\j35u5\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\win32\\lib\\__pycache__\\pywin32_bootstrap.cpython-39.pyc'
import 'pywin32_bootstrap' # <_frozen_importlib_external.SourceFileLoader object at 0x000001D305D83BB0>
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\pywin32_system32\win32file.cp39-win_amd64.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\pywin32_system32\win32file.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\pywin32_system32\win32file.py
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\pywin32_system32\win32file.pyw
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\pywin32_system32\win32file.pyc
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\win32\win32file.cp39-win_amd64.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\Lib\site-packages\win32\win32file.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\lib\encodings\ascii.cp39-win_amd64.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\lib\encodings\ascii.pyd
# trying C:\Users\j35u5\AppData\Local\Programs\Python\Python39\lib\encodings\ascii.py
# C:\Users\j35u5\AppData\Local\Programs\Python\Python39\lib\encodings\__pycache__\ascii.cpython-39.pyc matches C:\Users\j35u5\AppData\Local\Programs\Python\Python39\lib\encodings\ascii.py
# code object from 'C:\\Users\\j35u5\\AppData\\Local\\Programs\\Python\\Python39\\lib\\encodings\\__pycache__\\ascii.cpython-39.pyc'
import 'encodings.ascii' # <_frozen_importlib_external.SourceFileLoader object at 0x000001D305D833A0>
Traceback (most recent call last):
  File "C:\Users\j35u5\Sources\scanner\src\pymodules\test.py",line 2,in <module>
    import win32file
  File "<frozen importlib._bootstrap>",line 1007,in _find_and_load
  File "<frozen importlib._bootstrap>",line 986,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 666,in _load_unlocked
  File "<frozen importlib._bootstrap>",line 565,in module_from_spec
  File "<frozen importlib._bootstrap_external>",line 1108,in create_module
  File "<frozen importlib._bootstrap>",line 228,in _call_with_frames_removed
ImportError: DLL load failed while importing win32file: The specified module could not be found.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)