2016-11-09 10 views
19

Tôi đang cố gắng tìm ra cách để nạp năng động/nhập khẩu ẩn với PyInstaller, cho đến nay tôi có cấu trúc đơn giản này:Làm thế nào để thêm các mô-đun python động vào thông số kỹ thuật của PyInstaller?

Trước hết, tôi nhận được một gói khuôn khổ thêm vào cuộc sống của tôi trong PYTHONPATH d:\Sources\personal\python\framework

gói đó được sử dụng bởi nhiều dự án python của tôi, đặc biệt, nó được sử dụng với các dự án dưới đây đơn giản tôi muốn gói

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 

file spec của tôi trông như thế này:

# -*- mode: python -*- 

block_cipher = None 


a = Analysis(['main.py'], 
      pathex=['d:\\sources\\personal\\python\\pyqt\\pyshaders'], 
      binaries=None, 
      datas=[], 
      hiddenimports=[], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 

##### include mydir in distribution ####### 
def extra_datas(mydir): 
    def rec_glob(p, files): 
     import os 
     import glob 
     for d in glob.glob(p): 
      if os.path.isfile(d): 
       files.append(d) 
      rec_glob("%s/*" % d, files) 
    files = [] 
    rec_glob("%s/*" % mydir, files) 
    extra_datas = [] 
    for f in files: 
     extra_datas.append((f, f, 'DATA')) 

    return extra_datas 
########################################### 

a.datas += extra_datas('data') 

pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      exclude_binaries=True, 
      name='main', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True) 
coll = COLLECT(exe, 
       a.binaries, 
       a.zipfiles, 
       a.datas, 
       strip=False, 
       upx=True, 
       name='main') 

vấn đề này được đưa ra khi tôi cố gắng thêm nhập khẩu ẩn để phân tích (..., hiddenimports = [], ...) 's danh sách hiddenimports, tôi đã cố gắng cho đến nay này:

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

Cũng cố gắng liệt kê các file như cá nhân với đường dẫn tuyệt đối:

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' 
] 

Và cũng đã cố gắng để tải chúng như các gói mô-đun (__init__.py cuộc sống trong thư mục plugins)

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

Cũng thử collect_submodules

hiddenimports=collect_submodules('plugins') 

Không ai trong số những nỗ lực làm việc và thư mục Plugin isn' t được thêm vào đúng cách (khi tôi nói 'đúng' tôi đoán pyinstaller sẽ analize nhập khẩu được sử dụng bởi các plugin ẩn analiting đệ quy phụ thuộc của họ và sao chép các tập tin * .pyc) ... Vì vậy, tôi muốn biết làm thế nào tôi có thể quảng cáo không d đúng mô-đun "ẩn" đang được tải động theo thông số kỹ thuật của trình cài đặt.

+0

Bạn có thể thử thêm các tệp vào phụ thuộc ['pure'] (https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation) bằng cách sử dụng [' TOC'] (https: //pythonhosted.org/PyInstaller/advanced-topics.html#toc-class-table-of-contents). – Repiklis

+0

Có thể nhấn vấn đề này (https://github.com/pyinstaller/pyinstaller/issues/2009)? –

+0

Bạn đã thử sử dụng các móc PyInstaller (https://pyinstaller.readthedocs.io/en/stable/hooks.html) chưa? Chúng được thiết kế chính xác cho mục đích đó. – void

Trả lời

1

Tôi đã gặp sự cố khi đóng gói ứng dụng PyQt với Py2Exe (Tôi cũng đã gặp khó khăn với PyInstaller và cx_freeze, nhưng chỉ py2exe đã giúp tôi).

Đây là chi tiết solution. Tôi đã thêm chúng rõ ràng là:

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

Sau đó, tôi nhập và gọi. Hy vọng cách tiếp cận này sẽ hữu ích.

Các vấn đề liên quan