2017-02-10 205 views
1

我正在使用pyinstaller製作一個python腳本的一個文件夾可執行文件。它啓動相當緩慢。我的代碼中的第一件事是打印「開始」。當我運行可執行文件時,它會在屏幕上顯示超過10秒。我想縮短這個延遲時間。我猜想,要減少啓動所需的dll數量是很有幫助的。在pyinstaller中刪除對matplotlib和qt的依賴(緩慢啓動)

我注意到的一件事是,matplotlib和qt5 dll被複制到輸出文件夾,即使我不打算使用這些。在我自己的代碼中,我沒有依賴於這些庫。我進口:

import os 
import sys 
import argparse 
import numpy as np 
import logging 
import json 
from element import Square, Slanted 
from skimage import measure 
from skimage.segmentation import clear_border 
try: 
    from skimage import filters 
except: 
    from skimage import filter as filters 

from scipy import ndimage 
from scipy.ndimage.filters import gaussian_filter, median_filter 
from scipy.optimize import curve_fit 
from enum import Enum 
import time 

的pyinstall輸出的第一部分,直到它開始提matplotlib,是這樣的:

212 INFO: PyInstaller: 3.2.1 
213 INFO: Python: 3.5.2 
214 INFO: Platform: Windows-7-6.1.7601-SP1 
249 INFO: wrote x:\script.spec 
255 INFO: UPX is not available. 
308 INFO: Extending PYTHONPATH with paths 
['x:\\', 'x:\\script'] 
310 INFO: checking Analysis 
311 INFO: Building Analysis because out00-Analysis.toc is non existent 
312 INFO: Initializing module dependency graph... 
346 INFO: Initializing module graph hooks... 
352 INFO: Analyzing base_library.zip ... 
6794 INFO: running Analysis out00-Analysis.toc 
7585 INFO: Caching module hooks... 
7596 INFO: Analyzing x:\script.py 
10819 INFO: Processing pre-find module path hook distutils 
13057 INFO: Processing pre-find module path hook site 
13061 INFO: site: retargeting to fake-dir 'c:\\anaconda3\\envs\\myeenv\\lib\\site-packages\\PyInstaller\\fake-modules' 
20369 INFO: Processing pre-safe import module hook win32com 
27275 INFO: Processing pre-safe import module hook six.moves 
38245 INFO: Loading module hooks... 
38247 INFO: Loading module hook "hook-pydoc.py"... 
38250 INFO: Loading module hook "hook-xml.dom.domreg.py"... 
38253 INFO: Loading module hook "hook-xml.py"... 
38256 INFO: Loading module hook "hook-distutils.py"... 
38265 INFO: Loading module hook "hook-pytz.py"... 
38434 INFO: Loading module hook "hook-numpy.core.py"... 
38832 INFO: MKL libraries found when importing numpy. Adding MKL to binaries 
38837 INFO: Loading module hook "hook-_tkinter.py"... 
40127 INFO: checking Tree 
40129 INFO: Building Tree because out00-Tree.toc is non existent 
40131 INFO: Building Tree out00-Tree.toc 
40264 INFO: checking Tree 
40266 INFO: Building Tree because out01-Tree.toc is non existent 
40266 INFO: Building Tree out01-Tree.toc 
40301 INFO: Loading module hook "hook-PyQt5.QtCore.py"... 
40918 INFO: Loading module hook "hook-matplotlib.py"... 
43519 INFO: Loading module hook "hook-win32com.py"... 

我如何找出哪些庫是給我的matplotlib/QT5依賴?我還可以做其他事情來改善啓動時間嗎?

我已經嘗試使用:

pyinstaller script.py --exclude-module matplotlib,qt5 

但它仍然啓動包括matplotlib.backends等等

編輯

看來,skimage.segmentation被包括matplotlib ...

Traceback (most recent call last): 
    File "myenv\script.py", line 11, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\segmentation\__init__.py", line 6, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\segmentation\boundaries.py", line 5, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\morphology\__init__.py", line 1, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\morphology\binary.py", line 6, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\morphology\misc.py", line 5, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\morphology\selem.py", line 3, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\draw\__init__.py", line 1, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\draw\draw.py", line 6, in <module> 
    File "c:\anaconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\skimage\_shared\_geometry.py", line 4, in <module> 
ImportError: No module named 'matplotlib' 
Failed to execute script myenv 

編輯2

小測試。二手pyinstaller做出以下腳本的一個文件夾可執行文件:

import numpy as np 
print(np.array([0])) 

大約過了6秒運行。 今天早上我意識到我從samba mount運行,這可能會大大影響啓動時間。 相同的可執行文件需要0.7秒啓動時本地!儘管(> 500MB),我仍然對降低分配的大小感興趣。

+1

我的應用程序有許多依賴像你的情況上市(如wxPython的numpy的SciPy的matplotlib等),但在Win7上不到一秒啓動。我將它與py2exe打包在一起,當我比較幾個其他打包工具的啓動速度時,py2exe對我的應用程序來說是最好的。因爲你說的是​​dll,我認爲它也是Windows。 – otterb

+0

正確,使用Windows 7.感謝您使用py2exe的建議。我會檢查這一點。今天早上,我也意識到我正在從桑巴山上運行。我會用本地副本做一些測試並更新上面的問題。 – Goosebumps

回答

1

問題與不含模塊是,pyinstaller解釋命令行參數--exclude-module作爲一個包,因此

pyinstaller script.py --exclude-module matplotlib,qt5 

導致excludes=['matplotlib,qt5'].spec文件。

要排除兩個包,他們需要分開:

pyinstaller script.py --exclude-module matplotlib --exclude-module qt5