wxPython与py2app,CreateActCtx错误 0x00000008(可用磁盘空间不足)

1 投票
2 回答
1829 浏览
提问于 2025-04-16 03:25

我正在开发一个应用程序,使用wxPython作为图形界面库,并且用py2exe来方便地分发它。不过,我刚刚测试了py2exe,结果在启动可执行文件时出现了以下错误。

12:13:08: Debug: src/helpers.cpp(140): 'CreateActCtx' failed with error 0x00000008 (Not enough disk space available.).
Traceback (most recent call last):
  File "eYoutubeMacros3.py", line 1, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "application\application.pyo", line 5, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "application\backend\backend.pyo", line 4, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "application\backend\extractor.pyo", line 5, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "twisted\web\client.pyo", line 17, in <module>
  File "zipextimporter.pyo", line 82, in load_module
  File "twisted\web\error.pyo", line 188, in <module>
ImportError: cannot import name resource

导致错误的函数在src/helpers.cpp文件中是

static ULONG_PTR wxPySetActivationContext()
{

    OSVERSIONINFO info;
    wxZeroMemory(info);
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
    GetVersionEx(&info);
    if (info.dwMajorVersion < 5)
        return 0;

    ULONG_PTR cookie = 0;
    HANDLE h;
    ACTCTX actctx;
    TCHAR modulename[MAX_PATH];

    GetModuleFileName(wxGetInstance(), modulename, MAX_PATH);
    wxZeroMemory(actctx);
    actctx.cbSize = sizeof(actctx);
    actctx.lpSource = modulename;
    actctx.lpResourceName = MAKEINTRESOURCE(2);
    actctx.hModule = wxGetInstance();
    actctx.dwFlags = ACTCTX_FLAG_HMODULE_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID;

    h = CreateActCtx(&actctx);
    if (h == INVALID_HANDLE_VALUE) {
        wxLogLastError(wxT("CreateActCtx"));
        return 0;
    }

    if (! ActivateActCtx(h, &cookie))
        wxLogLastError(wxT("ActivateActCtx"));

    return cookie;
}

最后,这是我用来设置py2exe的代码

setup(
    console = [self.target], # Contains some build info, is this is relevant I'll add it
    zipfile = 'library.dat',
    options = {
        'py2exe' : {
            'bundle_files' : 1,
            'dll_excludes' : ['w9xpopen.exe'],
            'optimize'     : 2,
            'dist_dir'     : '../dist/executables/',
            'compressed'   : True,
            #'excludes'     : ['doctest', 'pdb', 'unittest', 'difflib', 'inspect'],
        }
    }
)

补充:是的,第二个错误似乎是来自twisted,但我怀疑这会导致第一个错误。
补充2:嗯,也许第一个只是个警告。

2 个回答

2

这意味着一些常用的控件没有加载。第二个错误可能是由于第一个错误引起的,但第一个错误并不致命,程序仍然可以继续运行。

首先尝试:

(不要使用打包选项)看看问题是否还会出现。通常这样做应该能解决问题。

bundle_files = 3 

接下来尝试:

因为你使用的是打包选项1,能不能检查一下在可执行文件旁边的dist目录里,哪个MSVC运行时DLL文件存在。我建议你还要在你的电脑上找到所有的MSVCRXX.dll,看看是否有版本上的问题。

0

结果发现,第一个只是个警告,而第二个问题通过明确地包含模块解决了。

撰写回答