欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pyinstaller打包找不到文件的問(wèn)題解決

 更新時(shí)間:2020年04月15日 10:14:37   作者:PurePeace  
這篇文章主要介紹了pyinstaller打包找不到文件的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、將python程序打包成單文件(使用 -F 參數(shù))后,嘗試運(yùn)行外部文件卻提示找不到的問(wèn)題

當(dāng)你將python程序打包成單文件(使用 -F 參數(shù))后,運(yùn)行程序,它實(shí)際上是先將exe內(nèi)的資源文件解壓到臨時(shí)文件夾,然后再運(yùn)行的,所以會(huì)導(dǎo)致這種問(wèn)題

比如,當(dāng)你在程序里面調(diào)用一個(gè)外部exe時(shí),但卻提示找不到該exe文件。

例子(這里我用win32api去隱式運(yùn)行外部exe文件):

import win32api
win32api.ShellExecute(0, 'open', 'nginx.exe', '', '', 0)

首先,你需要將這個(gè)外部的exe文件添加進(jìn)pyinstaller的打包里。

有兩種方法:

1、直接用參數(shù)添加:

--add-data "nginx.exe;."

完整命令:pyinstaller -F main.py --add-data "nginx.exe;."

2、在spec文件添加:

每次執(zhí)行pyinstaller打包命令后會(huì)生成spec文件,打開(kāi)它
在里面找到data=[] 列表,添加元素,變成了:datas=[('nginx.exe', '.')]
然后用spec打包:pyinstaller main.spec
我解釋一下這個(gè)點(diǎn)“.”是什么意思:

由于使用單文件打包出來(lái)的exe會(huì)先解壓再運(yùn)行,所以點(diǎn)“.” 其實(shí)表示你打包的這個(gè)exe文件運(yùn)行解壓的完整路徑

如:C:\...\temp(臨時(shí)文件夾)\asdqwezxc(你程序運(yùn)行時(shí)自動(dòng)解壓到的目錄)

  • 所以這個(gè)nginx.exe 被打包后,會(huì)解壓到 C:\...\temp\asdqwezxc\nginx.exe
  • 如果把點(diǎn)“.”改為test,就會(huì)解壓到 C:\...\temp\asdqwezxc\test\nginx.exe
  • 以此類(lèi)推

好,現(xiàn)在nginx.exe已被打包。然后要注意一個(gè)問(wèn)題:

打包出來(lái)的exe在運(yùn)行時(shí),它的工作路徑和它解壓到的路徑,是不一樣的!

你可以測(cè)試一下:

import os
print(os.getcwd())

可以發(fā)現(xiàn),打印出來(lái)的工作路徑并不是它運(yùn)行時(shí)解壓到的路徑!
而是這個(gè)打包出來(lái)的exe,它本身所存在的路徑!

問(wèn)題來(lái)了:

諸如open('xxx.txt')這些操作文件的函數(shù),一般首先都是在工作路徑查找你所指定的文件的。

所以,當(dāng)我們直接這樣執(zhí)行已打包的外部文件時(shí),程序會(huì)報(bào)找不到文件!所以請(qǐng)使用它的解壓路徑。

下面提供一個(gè)函數(shù),可以很方便的獲取到解壓路徑:

import os, sys
def base_path(path):
  if getattr(sys, 'frozen', None):
    basedir = sys._MEIPASS
  else:
    basedir = os.path.dirname(__file__)
  return os.path.join(basedir, path)

print(base_path(''))
print(base_path('test\gg.exe'))

第一句打印會(huì)顯示完整的解壓路徑:

C:\...\temp\asdqwezxc\

第二句打印是這樣的:

C:\...\temp\asdqwezxc\test\gg.exe

所以當(dāng)我們?cè)谡{(diào)用已打包的外部文件時(shí),應(yīng)該先使用os.chdir()將工作路徑改為解壓路徑:

再進(jìn)行操作,就不會(huì)報(bào)文件找不到了

os.chdir(base_path(''))
win32api.ShellExecute(0, 'open', 'nginx.exe', '', '', 0)

不過(guò)要注意的是,如果你要寫(xiě)出文件到程序所在的目錄(非解壓目錄),那么你得把工作目錄改回來(lái),否則文件會(huì)被寫(xiě)出到解壓路徑(臨時(shí)文件夾)。

稍微封裝一下就好了:

import os, sys

def base_path(path):
  if getattr(sys, 'frozen', None):
    basedir = sys._MEIPASS
  else:
    basedir = os.path.dirname(__file__)
  return os.path.join(basedir, path)

tmd = base_path('') # 這是解壓路徑
cwd = os.getcwd() # 這是程序的所在路徑

# 當(dāng)需要調(diào)用打包的外部文件時(shí)
os.chdir(tmd) # 先把工作路徑變成解壓路徑
do() # 執(zhí)行你要干的事情

# 當(dāng)需要寫(xiě)出文件到程序所在目錄時(shí)
os.chdir(cwd) # 把工作路徑切換回來(lái)
do() # 執(zhí)行你要干的事情

2、當(dāng)你使用cython將py文件編譯成pyd文件后使用pyinstaller打包,提示找不到模塊的問(wèn)題
直接使用pyinstaller打包py文件是很容易導(dǎo)致源碼被反編譯的

所以在打包的時(shí)候最好將py文件編譯成pyd文件,這樣可以很大程度上防止反編譯。

為什么呢?因?yàn)閜yd文件的來(lái)歷是這樣的:

py文件 → c文件 → pyd文件
所以直接反編譯pyd只能得到上一步cython生成的c文件,而無(wú)法得到我們的py源文件。

如何打包pyd成文件請(qǐng)看這篇文章:http://www.dbjr.com.cn/article/184725.htm
接下來(lái)回到我們的問(wèn)題。

解決方法很簡(jiǎn)單,請(qǐng)看:

比如說(shuō),我有一個(gè)文件main.py,引入了位于同級(jí)目錄下的test.py模塊

# main.py:就像這樣直接引入
import test

現(xiàn)在我將test.py 編譯成pyd文件,生成了:test.cp37-win_amd64.pyd

這個(gè)pyd文件名除了我們?cè)镜奈募鹴est,還會(huì)帶上編譯環(huán)境的名稱(chēng),這個(gè)環(huán)境后綴名我們可以不用管 ,因?yàn)閜ython引入模塊還是很智能的(會(huì)自動(dòng)引入.pyd文件,因?yàn)樗膬?yōu)先級(jí)高于.py文件)。

這么智能,但是為什么我用pyinstaller打包時(shí)就提示找不到文件?
其實(shí)我們需要在打包時(shí)--hidden-import這些模塊

1、直接添加

在打包時(shí)添加--hidden-import test即可
完整命令:pyinstaller -F --hidden-import test

2、使用spec文件

同樣的,運(yùn)行一次pyinstaller打包命令后會(huì)生成spec文件,打開(kāi)它
找到hiddenimports=[],添加test模塊,變成了:hiddenimports=['test']
很簡(jiǎn)單對(duì)吧?
而且除了我們自己寫(xiě)的一些py模塊,其它模塊在打包時(shí)可能也會(huì)提示找不到,都可以用這個(gè)方法解決。

3、打包成單文件時(shí)(使用-F參數(shù)),運(yùn)行時(shí)要求管理員權(quán)限的參數(shù)--uac-admin無(wú)效的問(wèn)題
請(qǐng)看我的這篇文章:pyinstaller打包單文件時(shí)–uac-admin選項(xiàng)不起作用怎么辦

本質(zhì)上大概也是因?yàn)檎也坏轿募?/p>

4、無(wú)控制臺(tái)打包(使用-w參數(shù)),運(yùn)行時(shí)彈框提示Failed to execute script的問(wèn)題
請(qǐng)看我的這篇文章:pyinstaller打包成無(wú)控制臺(tái)程序時(shí)運(yùn)行出錯(cuò),與popen沖突的解決方法

這個(gè)問(wèn)題一般是程序內(nèi)有輸入導(dǎo)致的,這個(gè)輸入可以是input(),也可以是其它的一些stdin操作(如os.popen實(shí)際上會(huì)造成輸入請(qǐng)求)

本質(zhì)上就是:使用-w參數(shù)(無(wú)控制臺(tái))打包時(shí)程序里不要請(qǐng)求輸入

當(dāng)然,實(shí)在要用輸入,又不想要控制臺(tái)怎么辦?很簡(jiǎn)單,把控制臺(tái)隱藏了就行!

下列兩個(gè)方法,試試看:

import ctypes
def hideConsole():
  """
  Hides the console window in GUI mode. Necessary for frozen application, because
  this application support both, command line processing AND GUI mode and theirfor
  cannot be run via pythonw.exe.
  """

  whnd = ctypes.windll.kernel32.GetConsoleWindow()
  if whnd != 0:
    ctypes.windll.user32.ShowWindow(whnd, 0)
    # if you wanted to close the handles...
    #ctypes.windll.kernel32.CloseHandle(whnd)

def showConsole():
  """Unhides console window"""
  whnd = ctypes.windll.kernel32.GetConsoleWindow()
  if whnd != 0:
    ctypes.windll.user32.ShowWindow(whnd, 1)

暫時(shí)就這么多呃,都是本人在打包過(guò)程中實(shí)際上遇到過(guò)的問(wèn)題和經(jīng)驗(yàn)。?;究捎?br />

到此這篇關(guān)于pyinstaller打包找不到文件的問(wèn)題解決的文章就介紹到這了,更多相關(guān)pyinstaller打包找不到文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Flask-Cache緩存實(shí)現(xiàn)給Flask提速的方法詳解

    使用Flask-Cache緩存實(shí)現(xiàn)給Flask提速的方法詳解

    這篇文章主要介紹了使用Flask-Cache緩存實(shí)現(xiàn)給Flask提速的方法,結(jié)合實(shí)例形式詳細(xì)分析了Flask-Cache的安裝、配置及緩存使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Python中獲取文件大小的四種辦法

    Python中獲取文件大小的四種辦法

    這篇文章主要給大家介紹了關(guān)于Python中獲取文件大小的四種辦法,我們可以使用Python中的os模塊來(lái)獲取視頻文件大小,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 利用Anaconda創(chuàng)建虛擬環(huán)境的全過(guò)程

    利用Anaconda創(chuàng)建虛擬環(huán)境的全過(guò)程

    因?yàn)槎啻沃匦屡渲铆h(huán)境,這些命令每次都要用,每次都忘記,需要重新搜索,所以記錄這一過(guò)程,下面這篇文章主要給大家介紹了關(guān)于利用Anaconda創(chuàng)建虛擬環(huán)境的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 保姆級(jí)python教程寫(xiě)個(gè)貪吃蛇大冒險(xiǎn)

    保姆級(jí)python教程寫(xiě)個(gè)貪吃蛇大冒險(xiǎn)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)雙人模式的貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解python-docx處理Word必備工具

    詳解python-docx處理Word必備工具

    這篇文章主要介紹了python-docx處理Word必備工具,我主要講講自己用到的幾個(gè)內(nèi)容是怎么設(shè)置的,對(duì)python-docx處理Word的相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-10-10
  • Python datetime模塊使用方法小結(jié)

    Python datetime模塊使用方法小結(jié)

    這篇文章主要介紹了Python datetime模塊使用方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python機(jī)器學(xué)習(xí)10大經(jīng)典算法的講解和示例

    Python機(jī)器學(xué)習(xí)10大經(jīng)典算法的講解和示例

    10個(gè)經(jīng)典的機(jī)器學(xué)習(xí)算法包括:線性回歸、邏輯回歸、K-最近鄰(KNN)、支持向量機(jī)(SVM)、決策樹(shù)、隨機(jī)森林、樸素貝葉斯、K-均值聚類(lèi)、主成分分析(PCA)、和梯度提升(Gradient?Boosting),我將使用常見(jiàn)的機(jī)器學(xué)習(xí)庫(kù),如scikit-learn,numpy和pandas?來(lái)實(shí)現(xiàn)這些算法
    2024-06-06
  • python中sklearn的pipeline模塊實(shí)例詳解

    python中sklearn的pipeline模塊實(shí)例詳解

    這篇文章主要介紹了python中sklearn的pipeline模塊的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python Web框架之Django框架cookie和session用法分析

    Python Web框架之Django框架cookie和session用法分析

    這篇文章主要介紹了Python Web框架之Django框架cookie和session用法,結(jié)合實(shí)例形式分析了Django框架cookie和session的常見(jiàn)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Python?matplotlib實(shí)現(xiàn)多子圖布局

    Python?matplotlib實(shí)現(xiàn)多子圖布局

    多子圖布局是指在一個(gè)圖像中同時(shí)顯示多個(gè)子圖,每個(gè)子圖可以是獨(dú)立的圖形或者是相互關(guān)聯(lián)的圖形,下面我們就來(lái)了解下matplotlib是如何實(shí)現(xiàn)多子圖布局的吧
    2023-12-12

最新評(píng)論