我想通過簡單的方法來更新我正在使用的程序,只需將替換.py文件放在一個文件夾中,然後再將它放在sys的頂部即可。所以所有導入語句將首先檢查該文件夾而不是我的頂級目錄,導入新的.py文件,而不是最初用PyInstaller構建程序的文件。現在,如果我用這個代碼:Pyinstaller程序中的模塊導入優先
import sys,os
bundlePath = 'c:/tests/importTest'
print ("Bundle path: {}".format(bundlePath))
importPath = bundlePath + '/uploads'
sys.path.insert(0,importPath)
print ("Import path: {}".format(sys.path[0]))
os.chdir(sys.path[0])
import testyTastery
print(testyTastery.message)
我的Python IDE或運行此腳本通過命令行來將打印從uploads/testyTastery.py
消息(也有testyTastery.py在頂級目錄)。但是,當我將第2行更改爲bundlePath = sys.path[1]
(因爲PyInstaller中的構建將頂級目錄放在sys.path [1]中,至少在Windows中,sys.path [0]指向PyInstaller創建的base_library.zip)並構建這到PyInstaller的文件夾包中(確保複製uploads/testyTastery.py
或將其包含在.spec
文件中),我從testyTastery.py腳本獲取消息,而不是uploads/testyTastery.py腳本。
關於如何輕易改變這個的任何想法?清楚的是,前兩個打印語句導致相同的輸出,用於在使用PyInstaller編譯之前和之後運行它,如上所述更改第二行之後。
我不知道,但也許它與PyInstaller總是在查看sys.path中的導入之前查看它打包的文件有關?
編輯:爲了清楚起見,如果我在沒有可用文件的情況下進行編譯,然後將這些文件放入適當的文件夾中,那麼導入優先級就像在命令行/ IDE中一樣。這表明由PyInstaller打包的文件在導入層次結構中較高。
如果你正在構建'--onedir',你可以運行'pyinstaller'來生成更新.pyd文件並複製和替換舊的。只要確保這個工作在分發「拍」之前CH」。 – Repiklis
感謝您的建議;我相信它對於其他人以及未來可能會派上用場。 我正在尋找一種方法來儘可能地用最少的數據推送更新,而您的建議將意味着大約10mb的數據與1-100kb的更新相比較,這些數據加起來很快,特別是與我計劃分發的方式更新(作爲通過ØMQ的直接轉賬)。 –
如果您不關心代碼向用戶公開的事實,則可以使用.py或.pyc文件替換.pyd。它仍然有效。 – Repiklis