2016-11-09 12 views
19

मैं, कैसे PyInstaller साथ गतिशील/छिपा आयात लोड करने के लिए यह पता लगाने की कोशिश कर रहा हूँ अब तक मैं इस सरल संरचना है:PyInstaller के चश्मा में डायनामिक पायथन मॉड्यूल कैसे जोड़ें?

सबसे पहले, मैं एक रूपरेखा पैकेज d:\Sources\personal\python\framework

में मेरी PYTHONPATH रहने में जोड़ा मिला

:

कि पैकेज मेरी अजगर परियोजनाओं के कई द्वारा प्रयोग किया जाता है, विशेष रूप से, यह आसान परियोजना नीचे मैं

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 की कोशिश की कोशिश की टी को ठीक से जोड़ा जा रहा है (जब मैं 'ठीक से' कहता हूं, मुझे लगता है कि पाइंस्टॉलर इन छिपे हुए प्लगइन द्वारा उपयोग की जाने वाली आयातों को पुन: सक्रिय रूप से उनकी निर्भरताओं और * .pyc फ़ाइलों की प्रतिलिपि बनाने के लिए उपयोग करेगा) ... तो, मैं जानना चाहता हूं कि कैसे क्या मैं विज्ञापन कर सकता हूँ डी ठीक से "छुपा" मॉड्यूल जो पाइंस्टॉलर के spec को गतिशील रूप से लोड किया जा रहा है।

+0

आप ['TOC'] का उपयोग कर [' pure'] (https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation) निर्भरताओं में फ़ाइलों को जोड़ने का प्रयास कर सकते हैं (https: //pythonhosted.org/PyInstaller/advanced-topics.html#toc-class-table-of-contents)। – Repiklis

+0

संभावित रूप से यह मार रहा है (https://github.com/pyinstaller/pyinstaller/issues/2009) समस्या? –

+0

क्या आपने PyInstaller hooks (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")] 
     } 
    ) 

फिर मैं उन्हें आयात करता हूं और कॉल करता हूं। आशा है कि यह दृष्टिकोण उपयोगी होगा।

संबंधित मुद्दे