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 解决办法