亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html

系統(tǒng) 2188 0

1 調(diào)試過(guò)程

用Python3.6+Sciter+PyCharm寫(xiě)了一個(gè)py測(cè)試腳本helloworld.py,該腳本中只含有一條語(yǔ)句“import sciter”。在PyCharm中運(yùn)行之,未報(bào)錯(cuò)。

            
#helloworld.py
import sciter
          

然后將該腳本用PyInstaller打包成exe文件,打包程序pack.py如下:

            
#pack.py
from PyInstaller.__main__ import run
if __name__ == '__main__':
  opts = [
      # 字符串前加“r”,防止字符轉(zhuǎn)義
      # r'--hidden-import=py4j.java_collections',\
      # 要打包的Python文件
      r'D:\work\python\my_editor\helloworld\helloworld.py',\
      # -F, ?Conefile 打包一個(gè)單個(gè)文件,如果你的代碼都寫(xiě)在一個(gè).py文件的話,可以用這個(gè),如果是多個(gè).py文件就別用
      # '-F',\
      # -w:制作窗口程序,與之相對(duì)的-c意味制作命令行程序(默認(rèn))。--distpath指定打包的目的地路徑
      r'-w','--distpath=D:\work\python\my_editor\helloworld\dist',\
      # --workpath 指定工作路徑
      r'--workpath=D:\work\python\my_editor\helloworld\out',\
      # --specpath指定.spec文件保存路徑
      r'--specpath=D:\work\python\my_editor\helloworld\out',\
      # --icon 指定exe文件的圖標(biāo)
      r'--icon=D:\work\python\my_editor\ico\text.ico',\
      # --upx-dir 使用upx壓縮
      r'--upx-dir','upx393w',\
      # --add-data 指定要包含的資源文件。
      # “C:\\Windows\\System32\\sciter.dll”為資源文件原本所在路徑(source)。
      # “.”為相對(duì)于exe文件的路徑(destination),在這里“.”為同一目錄的意思。
      # source路徑與destination路徑以英文狀態(tài)下分號(hào)“;”隔開(kāi)。
      # r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \
      # r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages'
      ]
  run(opts)
          

打包過(guò)程未報(bào)錯(cuò),但打包后執(zhí)行exe文件就出現(xiàn)問(wèn)題了,如下圖,報(bào)錯(cuò)“Failed to execute script helloworld”。

? Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html等文件問(wèn)題_第1張圖片

就這么一句話,沒(méi)有其他任何的報(bào)錯(cuò)信息,很令人惱火。后來(lái)查了資料,發(fā)現(xiàn)在打包時(shí),可以指定exe以命令行模式執(zhí)行,就能看到報(bào)錯(cuò)信息,而非以當(dāng)前的窗口模式執(zhí)行。即將上述pack.py腳本中的opts選項(xiàng)列表里的“-w”改為“-c”。

再次打包執(zhí)行exe文件,發(fā)現(xiàn)了彈出了一個(gè)含有報(bào)錯(cuò)信息的窗口。但是窗口一閃即逝,根本看不清里面的報(bào)錯(cuò)信息。這是因?yàn)槌绦驋伋霎惓M顺隽?;即使不拋出異常,窗口也?huì)因程序執(zhí)行完成而消失。于是將主程序helloworld.py的代碼改為如下:

            
#helloworld.py
import traceback
          
            
#加上try-except語(yǔ)句,是為了防止程序在出現(xiàn)異常時(shí)奔潰退出。
try:
  import sciter
except Exception as e:
  #打印異常棧軌跡。
  traceback.print_exc()
  #使程序阻塞,防止程序執(zhí)行完畢退出。
  a = input()
          

再次打包執(zhí)行exe文件,能看到報(bào)錯(cuò)信息了,如下圖。其中的核心信息是“ImportError: C:\Windows\System32\sciter.dll was not found in PATH”,即缺少sciter.dll文件。

Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html等文件問(wèn)題_第2張圖片

這就很奇怪了,在PyCharm中運(yùn)行時(shí)沒(méi)報(bào)這個(gè)錯(cuò)??!查看PyInstaller官網(wǎng),得知PyInstaller打包后的exe程序不能自動(dòng)識(shí)別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項(xiàng)。比如下面的helloworld.spec片段,添加了sciter.dll文件到與exe文件同級(jí)的目錄(.)中;添加了word.html到比exe文件所在目錄更深一層的目錄(pages)中(若是只報(bào)錯(cuò)缺少dll文件,可不指定html文件)。

#helloworld.spec片段

            
a = Analysis(['D:\\work\\python\\my_editor\\helloworld\\helloworld.py'],
       pathex=['D:\\work\\python\\my_editor\\helloworld\\out'],
       binaries=[],
       datas=[('C:\\Windows\\System32\\sciter.dll', '.'), ('D:\\work\\python\\my_editor\\helloworld\\pages\\word.html', 'pages')],
       hiddenimports=[],
       hookspath=[],
       runtime_hooks=[],
       excludes=[],
       win_no_prefer_redirects=False,
       win_private_assemblies=False,
       cipher=block_cipher,
       noarchive=False)
          

但每次執(zhí)行完打包程序后,還要手動(dòng)修改spec文件,很是麻煩。通過(guò)調(diào)試PyInstaller源代碼,找到了另一種方法,即在pack.py打包程序中的opts選項(xiàng)列表里加上兩個(gè)“--add-data選項(xiàng)”,如下:

#helloworld.py片段

            
opts = [
    """
    其他選項(xiàng)與上面的helloworld.py同,此處省略。
    """
    # --add-data 指定要包含的資源文件。
    # “C:\\Windows\\System32\\sciter.dll”為資源文件原本所在路徑(source)。
    # “.”為相對(duì)于exe文件的路徑(destination),在這里“.”為同一目錄的意思。
    # source路徑與destination路徑以英文狀態(tài)下分號(hào)“;”隔開(kāi)。
    r'--add-data', 'C:\\Windows\\System32\\sciter.dll;.', \
    r'--add-data', 'D:\\work\\python\\my_editor\\helloworld\\pages\\word.html;pages'
    ]
          

再次打包運(yùn)行exe文件,執(zhí)行成功!

2 要點(diǎn)總結(jié)

(1)調(diào)試打包時(shí),指定PyInstaller打包程序參數(shù)為“-c”(命令行模式),方便閱讀報(bào)錯(cuò)信息。等到調(diào)試完成正式上線后再改為“-w”。

(2)通過(guò)捕捉異常和使程序阻塞,防止程序過(guò)早退出,以便于看清楚報(bào)錯(cuò)信息。

(3)PyInstaller打包后的exe程序不能自動(dòng)識(shí)別資源文件(如dll、html、png等文件)的路徑,需要在spec文件中指定datas選項(xiàng),或者在PyInstaller打包程序參數(shù)中指定一個(gè)或多個(gè)“--add-data”選項(xiàng)。

總結(jié)

以上所述是小編給大家介紹的Python3+PyInstall+Sciter解決報(bào)錯(cuò)缺少dll、html等文件問(wèn)題 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本毛片免费看 | 伊人久久婷婷丁香六月综合基地 | 国产精品久久久久久久久kt | 欧美日韩亚毛片免费观看 | 中文字幕免费视频精品一 | 久久久久爽亚洲精品 | 中文字幕最新中文字幕中文字幕 | 九月婷婷天天澡天天添天天爽 | 亚洲精品视频在线观看视频 | 精品久久天干天天天按摩 | 国产精品久久久久毛片 | 午夜在线观看网站 | 日韩欧美福利 | 久久精品国产久金国产思思 | 999成人精品视频在线 | 久久99热国产这有精品 | 久久久久久久蜜桃 | julia中文字幕在线观看 | 超碰最新上传 | 69毛片 | 91长腿女神清纯大又嫩在线 | 国产成人精品亚洲日本在线观看 | 欧美色网 | 99国产精品久久久久久久... | 奇米影视第四色7777 | 午夜在线网址 | 五月天国产精品 | 猫咪www免费人成在线观看网址 | 毛片午夜 | 国产福利视精品永久免费 | 一级毛片日韩a欧美 | 四虎永久在线精品 | 久久99国产精品久久99 | 欧美日韩乱码毛片免费观看 | 国内成人精品视频 | 免费观看黄色小视频 | 91视频论坛 | 国产伊人久久 | 国产日韩欧美亚洲综合在线 | 欧美成免费 | 成人999 |