簡體   English   中英

你如何向 PyInstaller 編譯的 EXE 添加清單?

[英]How do you add a manifest to PyInstaller compiled EXE?

我正在嘗試將此清單添加到我的 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 的 --manifest 選項時,它不會添加到 EXE 或合並到生成的清單文件中。 我什至找不到一行說它在構建期間對清單做任何事情。 然后我使用 MT.exe 嵌入沒有錯誤的清單。 此清單文件是對 PyInstaller 生成的文件的修改。 我不得不刪除兼容性部分,因為 MT.exe 說命名空間兼容性中沒有兼容性選項......我添加了該部分以聲明應用程序具有 dpiAware。 執行此操作后,我可以看到使用 ResourceHacker 添加的清單部分,但是當我運行該程序時,它說無法打開 self 並且無法運行。 當我使用 ResourceHacker 嵌入清單時,程序將加載但仍然比打開 DPI 縮放的屏幕大,就像它只是忽略了清單文件。 我正在使用 python 3.5.1 和 kivy 1.9.1。

我有同樣的問題,使用 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM