gpt4 book ai didi

python - 在 PyInstaller 应用程序中启用 Windows 长文件路径支持

转载 作者:行者123 更新时间:2023-12-03 11:14:34 25 4
gpt4 key购买 nike

我在使用 PyInstaller 构建到可执行文件中的脚本时遇到了问题。该脚本在作为 Python 脚本运行时运行良好,但在作为 PyInstaller 应用程序运行时,遇到路径超过 260 个字符的文件时会失败。

我知道这是由于 limitation of Windows并且支持更长的路径必须是 opted into在注册表中和使用启用 longPathAware 设置的应用程序 list 。顺便说一下,这在 Python 本身中起作用的原因是因为 at Python 3.6 the developers enabled this setting对于 python.exepythonw.exe

到目前为止,我已经完成了所有这些工作,如果我将以下 list 文件放在构建的 PyInstaller 应用程序旁边(使用 --onefile 模式),它确实可以工作:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
</assembly>

但是,为了让最终用户的应用程序保持独立和可移植,我试图避免使用外部 list 文件,而是让 PyInstaller 将这个自定义 list 嵌入到可执行文件中。

--manifest option据称是这样做的——至少从 PyInstaller 3.5 开始,根据 changelogPR #3746 :

  • (Windows) Fix UAC in one-file mode by embedding the manifest. (#1729, #3746)

但是当指定时,自定义 list 文件似乎被忽略了,因为应用程序在没有外部 list 文件的情况下继续在长路径上失败,并检查 --onedir 中的捆绑 list 文件模式,看起来它忽略了自定义模式并创建了这个模式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<dependency>
<dependentAssembly>
<assemblyIdentity language="*" name="Microsoft.Windows.Common-Controls" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" type="win32" version="6.0.0.0"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"/>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

我是不是做错了或理解错了? --manifest 选项是否不符合我的想法?这是错误吗?

This answer描述了修改 PyInstaller 源代码以覆盖嵌入式 list 创建。这还有必要吗?

我在 GitHub 上也遇到了一个似乎有同样问题的项目; this PR 的作者状态:

Note that PyInstaller does not understand the longPathAware setting yet and strips it out of the manifest.

我不知道这是不是真的,但我认为这确实是一个错误。

我正在使用 PyInstaller 3.6、Python 3.7.2 和 Windows 10 版本 1809。

最佳答案

这现在在 PyInstaller 4.2 中实现:https://pyinstaller.readthedocs.io/en/v4.2/CHANGES.html

(Windows) Enable longPathAware option in built application’s manifest in order to support long file paths on Windows 10 v.1607 and later. (#5424)

关于python - 在 PyInstaller 应用程序中启用 Windows 长文件路径支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com