如何向PyInstaller编译的EXE添加清单?

时间:2017-05-06 18:11:09

标签: python manifest pyinstaller

我正在尝试将此清单添加到我的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。

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]