2016-11-09 125 views
19

我試圖找出如何加載動態/隱藏進口與PyInstaller,到目前爲止,我得到這個簡單的結構:如何添加動態python模塊到PyInstaller的規格?

首先,我得到了一個框架包加入到我的PYTHONPATH居住在d:\Sources\personal\python\framework

那包被許多我的Python項目,特別是,它與下面的簡單的項目,我要打包

Main project 

├───data  <- Pure static data 
├───plugins  <- Dynamic modules which uses framework's modules          
├───resources <- Static data+embedded (generated by pyqt), used by plugins 
│ ├───css            
│ ├───images      
| resources.py 
| resources.qrc      
main.py   <- Uses framework's modules to load plugins dynamically 

我的規格文件看起來像這樣用

問題是當我試圖隱藏的進口增加了分析(...,hiddenimports = [],...)的hiddenimports名單,我試過到目前爲止這樣的:

  • hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins']
  • hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins\\*']
  • hiddenimports=['plugins']

也試過上市使用絕對路徑作爲單獨的文件:

hiddenimports=[ 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\api.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\config.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_actions.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_dialogs.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_docks.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_post_init.py', 
    'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_toolbar.py' 
] 

而且還試圖將其加載爲模塊封裝(__init__.py生活在插件文件夾)

hiddenimports=[ 
    'plugins.api', 
    'plugins.config', 
    'plugins.plugins_actions', 
    'plugins.plugins_dialogs', 
    'plugins.plugins_docks', 
    'plugins.plugins_post_init', 
    'plugins.plugins_toolbar' 
] 

也試過collect_submodules

hiddenimports=collect_submodules('plugins') 

沒有這些嘗試的工作和文件夾插件ISN」 t被正確地添加到dist(當我說'正確'時,我猜pyinstaller會分析這些隱藏插件使用的導入方法,遞歸地分析它們的依賴關係並複製* .pyc文件)...所以,我想知道如何我可以做廣告嗎? d正確地「隱藏」模塊,這些模塊被動態加載到pyinstaller的規範中。

+0

你可以嘗試使用['TOC'(HTTPS將在['pure'(https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation)依賴的文件: //pythonhosted.org/PyInstaller/advanced-topics.html#toc-class-table-of-contents)。 – Repiklis

+0

可能碰到了這個問題(https://github.com/pyinstaller/pyinstaller/issues/2009)? –

+0

你嘗試使用PyInstaller掛鉤(https://pyinstaller.readthedocs.io/en/stable/hooks.html)?它們完全是爲此目的而設計的。 – void

回答

1

我有問題一樣用Py2Exe打包PyQt應用程序(我也努力與PyInstaller和cx_freeze,但只有py2exe幫助我)。

以下是詳細的solution。我已明確添加它們:

data_files += [('source', glob('source/*.py'),)] 
setup(
     data_files=data_files, 
     .... # other options 
     windows=[ 
     { 
      "script": "launcher.py", 
      "icon_resources": [(0, "resources/favicon.ico")] 
     } 
    ) 

然後我導入它們並調用。 希望這種方法將會有用。