PyInstaller 和超过 8 个字符的 MEIPASS 文件夹

Posted

技术标签:

【中文标题】PyInstaller 和超过 8 个字符的 MEIPASS 文件夹【英文标题】:PyInstaller and the MEIPASS folder with more than 8 characters 【发布时间】:2016-03-17 14:04:39 【问题描述】:

我有一个用 python 和 gtk 用 PyInstaller 编译的应用程序。

一切正常。但是,有时,应用程序在加载时会崩溃。 Windows 报告 ntdll.dll 失败。这可能会在任何 Windows 版本上发生。我找到了动机。

首先,根据文档how the one file program works,应用程序存储在一个名为 MEIXXXX 的临时文件夹中,其中 xxxxxx 是一个随机数。

然后,如果此文件夹的名称包含超过 8 个字符,我的应用程序将在此行崩溃:

self.builder.add_from_file(glade_file)

我的“glade_file”是这样安装的:

def resource_path(relative):
    directory = getattr(sys, '_MEIPASS', os.path.abspath('.'))
    return os.path.join(directory, relative)

它基于以下提示:

How to compile all resources into one executable file?

Bundling data files with PyInstaller (--onefile)

当文件夹名称超过八个字符时,Windows 会使用波浪号截断名称。像这样:

C:\Users\myuser\AppData\Local\Temp_MEI41~1

在这种情况下,真正的文件名是这样的:

_MEI 41402

我知道它是有效的,但这不是我正在经历的。

我的疑惑:

    有没有办法限制这个文件夹的大小? 我在文档中什么也没看到。 有没有办法改变place的临时文件夹? 还有其他方法可以解决我的问题,以便我的应用程序安全运行吗?

【问题讨论】:

【参考方案1】:

遇到类似问题,我使用以下方法检索了长路径:

if hasattr(sys, '_MEIPASS'):
    import win32api
    sys_meipass = win32api.GetLongPathName(sys._MEIPASS)

【讨论】:

你或许能帮我解决我的problem。

以上是关于PyInstaller 和超过 8 个字符的 MEIPASS 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中,如何创建一个返回超过 8,000 个字符的文本的函数?

Sonata Admin Bundle - RouteCompiler 错误,因为占位符超过 32 个字符

如何过滤(或替换)在 UTF-8 中占用超过 3 个字节的 unicode 字符?

pyinstaller打包报错: RecursionError: maximum recursion depth exceeded,UnicodeDecodeError 解决办法

减小 pyinstaller exe 的大小

现代 Unix/Linux 系统上的密码是不是仍限制为 8 个字符?