如何为PyInstaller编译的EXE文件添加清单?

4

我正在尝试将这个清单添加到我编译好的PyInstaller可执行文件中:

<?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的--manifest选项时,它没有被添加到生成的EXE或组合在生成的清单文件中。在构建过程中,我甚至找不到一行代码表明它正在处理清单文件。然后我使用MT.exe嵌入了清单文件,并且没有出现错误。这个清单文件是由PyInstaller生成的一个修改版本。我不得不删除兼容性部分,因为MT.exe说在兼容性命名空间中没有兼容性选项......我添加了声明应用程序具有dpiAware的部分。当我这样做后,我可以看到清单部分已经添加到ResourceHacker中,但当我运行程序时,它会提示无法打开自身并且无法运行。当我使用ResourceHacker嵌入清单时,程序将加载,但在DPI缩放打开的情况下仍然比屏幕大,就好像它忽略了清单文件。我使用的是Python 3.5.1和Kivy 1.9.1。
1个回答

5
我曾经遇到相同的问题,使用Pyinstaller 3.3。关于此问题有一个解释在这里,我采用了他们的答案并进行了修改以适应Pyinstaller 3.3,作为一个笨拙的解决办法。不幸的是,他们的解决方案需要编辑Pyinstaller源代码。
请编辑Pyinstaller中的<python install root>\Lib\site-packages\PyInstaller\building\api.py源文件,使assemble方法的开头看起来像这样:
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部分添加以下内容:

manifest_override=[NAME AND PATH OF YOUR MANIFEST FILE IN QUOTES]

Python 3和Pyinstaller 4.3更新(用以下内容替换相关行): logger.info("覆盖默认清单") os.chmod(tmpnm, 0o755) 在spec文件中:manifest_override="你的清单文件名和路径,用引号括起来"(不包括括号) - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接