2012-02-06 16 views
10

के साथ संकलित पायथन एप्लिकेशन के साथ उठाया गया है मुझे pytz का उपयोग करने वाले किसी एप्लिकेशन को वितरित करने में समस्या आ रही है। मैं अपने पायथन स्रोत से निष्पादन योग्य बनाने के लिए Py2Exe का उपयोग कर रहा हूं।अज्ञात टाइमज़ोन एरर अपवाद Py2Exe

समस्या मैं आ रही है की एक सरल उदाहरण के लिए, मेरे पास है: pytz_test.py:

import pytz 

tz_au = pytz.timezone("Australia/Sydney") 
print tz_au 

और setup.py में:

from distutils.core import setup 
import py2exe 

setup(console=['pytz_test.py'], options={"py2exe" : { 'packages': ['pytz'], } }) 

मैं तो setup.py चलाने :

python setup.py py2exe 

जो निष्पादन योग्य संकलित करता है। बनाया pytz_test.exe चल रहा है मैं:

मुझे लगता है ऐसा इसलिए है क्योंकि समय क्षेत्र जानकारी निष्पादन योग्य बंडल के साथ नहीं हो रही है, लेकिन मुझे यकीन है कि यह कैसे ऐसा करने के लिए नहीं कर रहा हूँ।

संपादित करें: एक सरल समाधान library.zip zoneinfo निर्देशिका जोड़ने के लिए, अजगर साइट-संकुल निर्देशिका में pytz मॉड्यूल से, होगा।

स्वचालित रूप से ऐसा करने के लिए, मुझे लगता है कि इस परियोजना में समाधान गूगल ट्रांजिट डाटा फीड इस्तेमाल किया, से पीछा किया: http://code.google.com/p/googletransitdatafeed/source/browse/trunk/python/setup.py

मेरे संशोधित setup.py अब की तरह दिखता है:

from distutils.core import setup 
import glob 
import py2exe 

options = { 
    "py2exe" : { 
     "compressed": 1, 
     "optimize": 2, 
     'packages': ['pytz'], 
    } 
} 

setup(console=['pytz_test.py'], options=options) 

import pytz 
import os 
import zipfile 
zipfile_path = os.path.join("dist/" 'library.zip') 
z = zipfile.ZipFile(zipfile_path, 'a') 
zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo') 
disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__)) 
for absdir, directories, filenames in os.walk(zoneinfo_dir): 
    assert absdir.startswith(disk_basedir), (absdir, disk_basedir) 
    zip_dir = absdir[len(disk_basedir):] 
    for f in filenames: 
     z.write(os.path.join(absdir, f), os.path.join(zip_dir, f)) 

z.close() 
+0

आपको setuptools के वर्तमान संस्करण की भी आवश्यकता है। विशेष रूप से pkg_resources। 'आयात pkg_resources' आयात विफल नहीं होना चाहिए। – sbaechler

+0

वास्तव में 'pkg_resources' कहां उपयोग किया जाता है? या बस इसे आयात करके? – Triztian

उत्तर

3

पाइथन साइट-पैकेज में pytz मॉड्यूल से जोनिनोफ़ निर्देशिका जोड़ने का एक आसान समाधान होगा। निर्देशिका, लाइब्रेरी.ज़िप पर।

स्वचालित रूप से ऐसा करने के लिए, मैं समाधान परियोजना गूगल ट्रांजिट डाटा फीड इस्तेमाल किया, से पीछा किया:

मेरे संशोधित setup.py अब लगता है कि:

from distutils.core import setup 
import glob 
import py2exe 

options = { 
    "py2exe" : { 
     "compressed": 1, 
     "optimize": 2, 
     'packages': ['pytz'], 
    } 
} 

setup(console=['pytz_test.py'], options=options) 

import pytz 
import os 
import zipfile 
zipfile_path = os.path.join("dist/" 'library.zip') 
z = zipfile.ZipFile(zipfile_path, 'a') 
zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo') 
disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__)) 
for absdir, directories, filenames in os.walk(zoneinfo_dir): 
    assert absdir.startswith(disk_basedir), (absdir, disk_basedir) 
    zip_dir = absdir[len(disk_basedir):] 
    for f in filenames: 
     z.write(os.path.join(absdir, f), os.path.join(zip_dir, f)) 

z.close() 

(प्रश्नकर्ता द्वारा उत्तर दिया गया)

2

मैन्युअल रूप से जोनिनफ़ो को ज़िपित करना (जैसा कि जेसन एस द्वारा वर्णित है) वास्तव में बिल्डिन के लिए मदद करता है मेरे कंप्यूटर में से एक पर पैकेज। हालांकि, जब मैंने किसी अन्य कंप्यूटर पर पैकेज बनाया - त्रुटि वापस आई थी! कारण ढूंढने में मुझे कुछ समय लगे - इसलिए मैं बेहतर साझा करूंगा।

प्रस्तावित समाधान नए pytz-version (कम से कम 2014.7 के साथ) के साथ काम नहीं करता है! डिगिंग क्यों यह पता चला है कि pytz ने jyinfo फ़ाइलों के प्रारूप को पीईसी से कुछ बाइनरी प्रारूप में बदल दिया है।मेरे लिए ऐसा लगता है, इस बदलाव के साथ उन्होंने एक ज़िप में pytz को पैक करने का विकल्प "तोड़ दिया", क्योंकि पाइथन का बिल्टिन ज़िपिमपोर्ट तंत्र बाइनरी फाइलों को लोड करने के लिए काम नहीं करता है। वास्तव में, इस समस्या को pytz द्वारा तय किया जाना चाहिए, लेकिन अब के लिए मैं एक और समाधान मिला:

  • बस अपने जिले निर्देशिका
  • में सीधे पूरे pytz निर्देशिका कॉपी अपने कार्यक्रम के भीतर अपने main- के मार्ग को जोड़ने अजगर की खोज पथ

व्यावहारिक रूप से करने के लिए exectutable, यह आपके setup.py भीतर का मतलब है की जगह pytz-ज़िप करने

import pytz, os, shutil 
srcDir = os.path.dirname(pytz.__file__) 
dstDir = os.path.join('dist', 'pytz') 
shutil.copytree(srcDir, dstDir, ignore = shutil.ignore_patterns('*.py')) 
साथ

और -option "पैकेज" से pytz स्थानांतरित करने के लिए "शामिल नहीं":

options = { 
    "py2exe" : { 
     "compressed": 1, 
     "optimize": 2, 
     "packages": [], 
     "excludes": ['pytz'] 
    } 
} 

अपने कार्यक्रम का मुख्य प्रवेश पर (यकीन है कि यह आयात करने pytz से पहले मार डाला जाता है बनाने के लिए), आप कुछ जोड़ना होगा जैसे:

import os, sys 
basePath = os.path.dirname(os.path.abspath(sys.argv[0])) 
sys.path.insert(0, basePath) 
+0

यह मेरे लिए काम कर रहा है (pytz 2014.10), लेकिन मुझे shutil.copytree() से सभी अनदेखा को हटाना पड़ा। – Geotob

+0

हां! इसने काम कर दिया! हालांकि सबसे अजीब बात यह है कि py2exe के साथ मेरा pytz काम कर रहा था। तब मैंने अपने कार्यक्रम में कुछ चीजों को संशोधित किया, पूरी तरह से pytz से असंबंधित, और अचानक यह काम करना बंद कर दिया और UnkownTimeZoneError – wordsforthewise

+0

शब्दों को उदासीनता दिया, बिल्कुल! वह भी मेरी समस्या थी। और जब से (कम से कम मेरे लिए) यह हमेशा स्पष्ट नहीं होता है कि py2exe क्या करता है और यह अपनी चीजों को कैसे एकत्र करता है, मुझे py2exe के संग्रह चरण के दौरान क्या गलत हुआ, यह जानने के लिए मुझे डिबग प्रिंट्स को pytz में भी हैक करना पड़ा। :-) – Zappotek

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