我遇到了一个问题,我将脚本构建成一个使用PyInstaller制作的可执行文件。当作为Python脚本运行时,脚本正常工作,但当作为PyInstaller应用程序运行时,如果遇到路径长度超过260个字符的文件,它就会失败。
我知道这是由于Windows的限制,必须在注册表中和使用启用
到目前为止,我已经完成了所有这些步骤,确实如果我将以下清单文件与构建的PyInstaller应用程序(使用
然而,为了使应用程序自包含且便于终端用户使用,我试图避免使用外部清单文件,并让PyInstaller将此自定义清单嵌入可执行文件中。据说
我是否做错或理解有误?
我还发现GitHub上的一个项目似乎也遇到了同样的问题;这个PR的作者说:
“请注意,PyInstaller尚不理解
我不知道这是否正确,但我认为这确实证明了这是一个bug。
我正在使用PyInstaller 3.6,Python 3.7.2和Windows 10版本1809。
我知道这是由于Windows的限制,必须在注册表中和使用启用
longPathAware
设置的应用程序清单中选择支持更长的路径。顺便说一下,之所以Python本身可以工作,是因为在Python3.6中,开发人员为python.exe
和pythonw.exe
启用了此设置。到目前为止,我已经完成了所有这些步骤,确实如果我将以下清单文件与构建的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>
然而,为了使应用程序自包含且便于终端用户使用,我试图避免使用外部清单文件,并让PyInstaller将此自定义清单嵌入可执行文件中。据说
--manifest
选项可以实现这一点 - 至少从PyInstaller 3.5开始,根据changelog和PR #3746的说法:
但是当指定了自定义清单文件时,似乎被忽略了,因为在没有外部清单文件的情况下应用程序仍然无法处理长路径,并且在
--onedir
模式下检查捆绑的清单文件时,它看起来只是忽略了自定义的清单文件并创建了这个替代文件:<?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
选项是否没有实现我所想的功能?这是一个bug吗?
这个答案描述了修改PyInstaller源代码以覆盖嵌入式清单创建的过程。这仍然是必要的吗?我还发现GitHub上的一个项目似乎也遇到了同样的问题;这个PR的作者说:
“请注意,PyInstaller尚不理解
longPathAware
设置,并将其从清单中删除。”我不知道这是否正确,但我认为这确实证明了这是一个bug。
我正在使用PyInstaller 3.6,Python 3.7.2和Windows 10版本1809。
dpiAware
。至少可以使用外部清单,所以不太繁琐,只是不理想。 - blah238mt.exe
会破坏它们:https://dev59.com/q2zXa4cB1Zd3GeqPSE-4#14654743 -- 你知道其他的方法吗? - blah238