2012-08-03 21 views
12

के साथ सब-फ़ोल्डर में सभी DLL और PYD बढ़ते इस cx_Freeze मेलिंग सूची पर काफी कुछ समय आ गया हैcx_Freeze

(देखें

cx_Freeze and moving files around

Creating fewer files when freezing a Python application

cx_freeze python single file? )

और ऐसा लगता है कि यह एक साधारण फिक्स होना चाहिए, लेकिन मैं कैसे शुरू करना नहीं देख सकता।

मेरे पास एक पायथन एप्लिकेशन है जो scipy, wxpython, numpy और अन्य संकुलों का एक समूह पर निर्भर करता है जिनमें प्रत्येक के पास गतिशील रूप से जुड़े पुस्तकालयों का बहुत कुछ होता है। मुख्य निष्पादन योग्य फ़ोल्डर पीवायडी और डीएलएल फाइलों के साथ बहुत अव्यवस्थित हो जाता है और सभी फ़ाइलों के बीच निष्पादन योग्य भी ढूंढना मुश्किल है। मेरे उपयोगकर्ता विशेष रूप से कंप्यूटर समझदार नहीं हैं, इसलिए स्पष्टता बहुत महत्वपूर्ण है।

मुझे एक निष्पादन योग्य की आवश्यकता नहीं है जैसे सैद्धांतिक रूप से bbfreeze द्वारा उत्पन्न किया जा सकता है। मुझे पसंद है कि distutils setup.py फ़ाइल cx_Freeze के साथ कैसे काम करती है और हर तरफ cx_Freeze बहुत शानदार है।

मैं चाहता हूं कि मुख्य निष्पादन योग्य फ़ोल्डर को साफ़ करने का एक तरीका है। मैं DLL फ़ाइलों को मैन्युअल रूप से एक फ्रीज_लिब्स फ़ोल्डर या किसी चीज़ में ले जाने के साथ पूरी तरह खुश हूं और फिर साझा लाइब्रेरी लोडिंग पथ को मंग कर रहा हूं ताकि यह संभव हो तो गतिशील पुस्तकालयों को ढूंढने में सहायता करें। या कुछ इस तरह का।

धन्यवाद

+0

[ConsoleSetLibPath] (https://bitbucket.org/anthony_tuininga/cx_freeze/src/default/cx_Freeze/initscripts/ConsoleSetLibPath.py) initscript पर एक नज़र डालें। सबफ़ोल्डर में पुस्तकालयों को देखने के लिए इसे ट्विक करना संभव होना चाहिए। –

+0

आप उस initscript का उपयोग कैसे करते हैं? यह बहुत ही आशाजनक दिखता है लेकिन मुझे नहीं लगता कि इसे कैसे एकीकृत किया जाए। – ibell

+0

यदि आप setup.py स्क्रिप्ट का उपयोग कर रहे हैं, तो 'build_exe' ([docs] (http://cx-freeze.readthedocs.org/en/latest/distutils) के लिए' init_script' विकल्प निर्दिष्ट करें।एचटीएमएल # build-exe))। या यदि आप 'cxfreeze' कमांड का उपयोग कर रहे हैं, तो एक [--init-script flag] है (http://cx-freeze.readthedocs.org/en/latest/script.html#cmdoption--init-script) । –

उत्तर

3

मैं आपकी निराशा को समझता हूं। मैं जो करना चाहता हूं वह पूरे बिल्ड फ़ोल्डर को ले जाता है और इसे प्रोग्राम फाइल निर्देशिका में ले जाता है मानते हुए कि आप विंडोज मशीन का उपयोग कर रहे हैं। फिर निष्पादन योग्य पर डेस्कटॉप पर शॉर्टकट बनाएं। मैं आम तौर पर आंखों को प्रसन्न करने के लिए आइकन बदलता हूं। दूसरे शब्दों में सभी सिस्टम फाइलें छिपी हुई हैं और आप जिनके साथ छोड़े गए हैं वे डेस्कटॉप पर एक अच्छा दिखने वाला आइकन है।

3

"मैन्युअल रूप से" किया, लेकिन क्या यह सही तरीका है? मैं Win7 x64 cx_freeze पर 4.3.2

मेरी init_script हूँ, Console.py और ConsoleSetLibPath.py

import encodings 
import os 
import sys 
import warnings 
import zipimport 

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep) 
if DIR_NAME not in paths: 
    paths.insert(0, DIR_NAME) 
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths) 
    os.execv(sys.executable, sys.argv) 

sys.frozen = True 
sys.path = sys.path[:4] 

# i added this line 
sys.path.append(r'lib') 

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") 
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") 

m = __import__("__main__") 
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) 

# The following if/else is copied from ConsoleSetLibPath.py 
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME: 
    moduleName = m.__name__ 
else: 
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME))) 
    moduleName = "%s__main__" % name 

code = importer.get_code(moduleName) 
exec code in m.__dict__ 

versionInfo = sys.version_info[:3] 
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4): 
    module = sys.modules.get("threading") 
    if module is not None: 
     module._shutdown() 

से संयुक्त तब मैं ConsoleSetLibPathx.py के रूप में और मेरे setup.py में C:\Python27\Lib\site-packages\cx_Freeze\initscripts में इस फ़ाइल को सहेजने

setup(
    name = 'xxx', 
    version = '0.1', 
    options = {'build_exe': {'includes':includes, 
          'excludes':excludes, 
          'packages':packages, 
          'include_files':includefiles, 
          'create_shared_zip':True, 
          'include_in_shared_zip':True, 
           # use the "hacked" init_script ? 
          'init_script':'ConsoleSetLibPathx', 
          'include_msvcr':True, 
          } 

          }, 
    executables = [exe] 
) 

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works. 

मुझे लगता है कि मुझे इसे विकल्पों में या कहीं भी करना चाहिए, लेकिन अभी सीएक्स_फ्रीज़ दस्तावेज़ को बिल्कुल समझ में नहीं आता है। शायद - लक्ष्य-डीआईआर या --default-path या --replace-paths? सुनिश्चित नहीं है कि उनका उपयोग कैसे करें

संपादित करें: क्षमा करें, इसे सुधारने की आवश्यकता है, जब मैं इसे वीएमवेयर में एक और स्वच्छ win7 में जांचता हूं, यह काम कर रहा है लेकिन यह अजीब अभिनय कर रहा है, मेरा कोड गैर-अवरुद्ध पढ़ने की कुंजीपटल काम नहीं कर रहा है। सुनिश्चित नहीं है कि कौन सा हिस्सा गलत है।

+0

नहीं, मुझे नहीं लगता कि वर्तमान में इनसाइटस्क्रिप्ट को संपादित किए बिना ऐसा करने का कोई विकल्प है। –

+0

वैसे, शीर्ष पर 'LD_LIBRARY_PATH' को संशोधित करने वाले अनुभाग में, मुझे लगता है कि आपको' paths.insert (0, DIR_NAME) 'को 'paths.insert (0, os.path.join (DIR_NAME' में बदलने की आवश्यकता हो सकती है , 'lib')) '। यह केवल यूनिक्स सिस्टम को प्रभावित करता है, हालांकि। विंडोज के लिए, मुझे लगता है कि आपको उसी निर्देशिका को 'पथ' पर्यावरण चर में जोड़ने की आवश्यकता हो सकती है। –

+0

'DIR_NAME' कहां से आ रहा है? मुझे लाइन 'os.environ ["LD_LIBRARY_PATH"] = os.pathsep.join (पथ)' पर एक त्रुटि मिल रही है क्योंकि मान बहुत लंबा है। यह अजीब लगता है, क्योंकि विंडोज़ पर यह 'lib', तीन अक्षर होना चाहिए। – ToothlessRebel

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