我正在尝试将此清单添加到我的PyInstaller编译的EXE:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="TestApp" processorArchitecture="amd64" type="win32" version="1.0.0.0"/>
<dependency>
<dependentAssembly>
<assemblyIdentity language="*" name="Microsoft.Windows.Common-Controls" processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df" type="win32" version="6.0.0.0"/>
</dependentAssembly>
</dependency>
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
当我使用PyInstaller的 - 显示选项时,它不会被添加到EXE或组合在生成的清单文件中。我甚至找不到一条线说它在构建过程中对清单做了什么。然后我使用MT.exe嵌入清单没有错误。此清单文件是PyInstaller生成的文件的修改。我不得不删除兼容性部分,因为MT.exe说命名空间兼容性中没有兼容性选项...我添加了部分以声明应用程序具有dpiAware。在我这样做之后,我可以看到使用ResourceHacker添加的清单部分,但是当我去运行该程序时,它说不能打开自己并且不运行。当我使用ResourceHacker嵌入清单时,程序将加载但仍然大于打开DPI缩放的屏幕,就像它忽略清单文件一样。我使用的是python 3.5.1和kivy 1.9.1。
答案 0 :(得分:3)
我有同样的问题,使用Pyinstaller 3.3。给出了解释here并且我修改了他们的答案,为Pyinstaller 3.3更新它,作为一种笨拙的解决方法。不幸的是,他们的解决方案需要编辑Pyinstaller源代码。
在Pyinstaller中编辑api.py源文件,因此汇编方法的开头如下所示:
def assemble(self):
logger.info("Building EXE from %s", self.tocbasename)
trash = []
if os.path.exists(self.name):
os.remove(self.name)
if not os.path.exists(os.path.dirname(self.name)):
os.makedirs(os.path.dirname(self.name))
exe = self.exefiles[0][1] # pathname of bootloader
if not os.path.exists(exe):
raise SystemExit(_MISSING_BOOTLOADER_ERRORMSG)
# BEGINNING OF CHANGES
if self.manifest_override != False:
print "Overriding default manifest"
tmpnm = tempfile.mktemp()
shutil.copy2(exe, tmpnm)
os.chmod(tmpnm, 0755)
winmanifest.UpdateManifestResourcesFromXMLFile(tmpnm, self.manifest_override, names=[1], languages=[1033])
exe = tmpnm
trash.append(tmpnm)
# END OF CHANGES
if is_win and (self.icon or self.versrsrc or self.resources):
也在标有
的部分的api.py中# Available options for EXE in .spec files
添加
self.manifest_override = kwargs.get('manifest_override', False)
最后在EXE部分的spec文件中添加:
manifest_override=[NAME AND PATH OF YOUR MANIFEST FILE IN QUOTES]