èæ¯
ã¢ã¯ããã¹ãã¯ãããžãŒã®éçºã®ç¹å®ã®æ®µéã§ã補åã®äžéšãšããŠç¬èªã®ã¢ã»ã³ããªã®python3èšèªã€ã³ã¿ãŒããªã¿ãŒãé
åžãããããã®è£œåã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãžã®ã¢ã¯ã»ã¹ãæäŸããç¬èªã®ã¢ãžã¥ãŒã«ã§æ¡åŒµããå¯èœæ§ãæ€èšããããšã決å®ãããŸããã ãã®æçš¿ã¯ããã®æ¹åã®ç 究çµæã®1ã€ã§ãã
ãŸããéãããã³ã³ãã¯ããªæéåé
åžå¯èœã¢ãžã¥ãŒã«ã®ã»ãããå¿
èŠã§ããã ãã ãã
python.orgãä»ããŠé
åžãããå
¬épythonã¢ã»ã³ããªã«ã¯ããããããŸãããæšæºã©ã€ãã©ãªã ãã¯ãèšèªèªäœã®äžå¯æ¬ ãªéšåã§ããã1000ãè¶
ããpyãã¡ã€ã«ã§æ§æãããŠããŸãã ãã®ããã1ã€ãŸãã¯è€æ°ã®ã¢ãžã¥ãŒã«ã«é¢é£ããPythonã®ãœãŒã¹ã³ãŒãã®ã»ããå
šäœãzipã¢ãŒã«ã€ãã«ããã¯ããã1ã€ã®zipãã¡ã€ã«ã§é
åžãããå Žåãzipã¢ãŒã«ã€ãã«ããã¢ãžã¥ãŒã«ãã€ã³ããŒãããæ©èœãªã©ãã€ã³ã¿ãŒããªã¿ãŒã®èå³æ·±ãæ©èœã«ããã«æ³šç®ããŸããã
æ¯ãè¿ã£ãŠã¿ããšãPythonã§ã®zipã¢ãžã¥ãŒã«ã®æäœã®ãµããŒãã¯åŒ·åã§äŸ¿å©ãªãã®ã§ãããšèªä¿¡ãæã£ãŠèšããŸãã ãããŠãããã¯æ©èœããããŸãæ©èœããŸãã zip-peggingã®ç²Ÿç¥ãå¹ã蟌ãã zipã¢ãžã¥ãŒã«ã®äžé£ã®å®éšã®åŸãPythonèšèªã®æšæºã©ã€ãã©ãªå
šäœïŒãã®ã¹ã¯ãªããéšåïŒãå¥ã®zipãã¡ã€ã«ã«ããã¯ãããããã«ãªããŸããã
éå§ãã
ãŸããã§ããã ãã·ã³ãã«ãªãã¹ãç°å¢ãäœæããŸãããåæã«ã説æããæ©èœã®ãã¹ãŠã®æå³ãããæ©èœãå®èšŒããã®ã«ååã§ãã ç°å¢ã¯Windowsã«ãªãã®ã§ãçŸæç¹ã§ã¯ç§ã«ãšã£ãŠãã䟿å©ã§ããããšãããããŸããã ããã«æããLinuxã®äŸãè©ŠããŠã¿ãã人ã®ããã«ãåºæ¬çãªéãã¯ãªãã¯ãã§ããå¿
èŠãªã®ã¯ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ããã±ãŒãžãããŒãžã£ãŒããŸãã¯å€ãè¯ã
configure / make / make installãéããŠã€ã³ã¹ããŒã«ãããpython3ã ãã§ã
ãzipã§ããã¯ããç°¡åãªãã¢ã¢ãžã¥ãŒã«ã¯ãæåã¯dïŒ\ habr \ libã«ãããŸãã
- say_hello.py
def say_hello(): print("Hello python world.")
- my_sysinfo / __ init__.py
from .sysinfo import print_sysinfo
- my_sysinfo / sysinfo.py
import sys import traceback def print_sysinfo(): print(80 * '-') print(sys.version) print(80 * '-') traceback.print_stack() print(80 * '-')
ãšããããããã€ãã®ã¢ãžã¥ãŒã«ã1ã€ã®zipãã¡ã€ã«ã«ããã¯ããæ©èœãå®èšŒãããã£ããããããã§ã¯ç°ãªãã¿ã€ãã®2ã€ã®ã¢ãžã¥ãŒã«ãäœæããŸãããæåã®
say_hello
ã¢ãžã¥ãŒã«ã¯
say_hello()
é¢æ°ã
say_hello()
ãã
say_hello.py
ãã¡ã€ã«ã§æ§æããã2çªç®ã®
my_sysinfo
ã¢ãžã¥ãŒã«
my_sysinfo
ããå°ãè€éã«ãªããŸã-ã€ã³ããŒããªã¹ãã«
print_sysinfo
é¢æ°ãå«ã
__init__.py
ãã¡ã€ã«ãå«ããã£ã¬ã¯ããªã®åœ¢åŒã ä»åŸã
sys.version
ãªã©ã®èŠçŽæ
å ±ã®äžã§ãç¹ã«ãã®é¢æ°ã¯ãzipããŒãžã³ã°ã®æ©èœãæããã«ããããã®ç¬èªã®åŒã³åºãã¹ã¿ãã¯ãå°å·ãããšããã«èšããŸãã
ãã¹ãŠãã¢ã³ããã¯åœ¢åŒã§æ©èœããããšã確èªããŸãã
c:\Python33\python.exe
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.insert(0,'d:\\habr\\lib') >>> import say_hello >>> say_hello.say_hello() Hello python world. >>> import my_sysinfo >>> my_sysinfo.print_sysinfo() -------------------------------------------------------------------------------- 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] -------------------------------------------------------------------------------- File "<stdin>", line 1, in <module> File "d:\habr\lib\my_sysinfo\sysinfo.py", line 9, in print_sysinfo traceback.print_stack() --------------------------------------------------------------------------------
ãžãããããã³ã°
zip圢åŒã®ãœãŒã¹pyãã¡ã€ã«ã®ããã±ãŒãžã«ã¯ç§å¯ããããŸããã ãããè¡ãã«ã¯ãæå
ã§å©çšã§ããä»»æã®zipã¢ãŒã«ã€ãã䜿çšããããæšæºã®
zipfile
ã¢ãžã¥ãŒã«ã®æ©èœã䜿çšããŠpythonã¹ã¯ãªããã§çŽæ¥ããã¯ããŸãã åŸã§ã
mkpyzip.pyãšããååãä»ããŠdïŒ\ habr \ toolsãã©ã«ããŒã«å
¥ããåçŽãªããã±ãŒãžã¹ã¯ãªããã®ã³ãŒããæäŸããŸãã
ãã®ã¹ã¯ãªããã䜿çšããŠãäžèšã®ã¢ãžã¥ãŒã«ãzipãã¡ã€ã«dïŒ\ habr \ output \ mybundle.zipã«ããã¯ããŸãã
:\Python33\python.exe d:\habr\tools\mkpyzip.py --src d:\habr\lib\my_sysinfo d:\habr\lib\say_hello.py --out d:\habr\output\mybundle.zip ::: d:\habr\lib\my_sysinfo\__init__.py >>> mybundle.zip/my_sysinfo/__init__.py ::: d:\habr\lib\my_sysinfo\sysinfo.py >>> mybundle.zip/my_sysinfo/sysinfo.py ::: d:\habr\lib\say_hello.py >>> mybundle.zip/say_hello.py
ãšããããã©ã®ãã¡ã€ã«ããã³ã©ã®ååã§zipã¢ãŒã«ã€ãã«ããã¯ããããã«ã€ããŠã®è©³çŽ°ãªçµè«ããã®ã¹ã¯ãªããã«è¿œå ãããŸããã
ãã®ãããªzipã¢ãŒã«ã€ãã«ããã±ãŒãžåãããšããã¹ãŠãæ©èœããããšã確èªããŸãã
c:\Python33\python.exe
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.insert(0, 'd:\\habr\\output\\mybundle.zip') >>> import say_hello >>> say_hello.say_hello() Hello python world. >>> import my_sysinfo >>> my_sysinfo.print_sysinfo() -------------------------------------------------------------------------------- 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] -------------------------------------------------------------------------------- File "<stdin>", line 1, in <module> File "d:\habr\output\mybundle.zip\my_sysinfo\sysinfo.py", line 9, in print_sysinfo traceback.print_stack() --------------------------------------------------------------------------------
my_sysinfo.print_sysinfo()
ããããã¹ãŠãæåŸ
ã©ããã«åäœããzipã¢ãŒã«ã€ãã«ããã¯ãããŠããããšã
my_sysinfo.print_sysinfo()
ãŸããç¹ã«ãé¢æ°
my_sysinfo.print_sysinfo()
ããã®ã¹ã¿ãã¯ã®ããªã³ãã¢ãŠãã¯ãåŒã³åºãããé¢æ°ã®ã³ãŒããzipãã¡ã€ã«å
ã«ããããšã瀺ããŸã-dïŒ\ habr \ output \ mybundle .zip \ my_sysinfo \ sysinfo.py
zipã§ããã¯ãããšãã®ãã€ãã³ãŒãçæ
ã¢ãžã¥ãŒã«ã®ã€ã³ããŒãæã«ãã€ãã³ãŒããçæããããŸãã¯ã€ã³ããŒãæã«æå¹ãªå Žåã¯ä»¥åã«çæããããã€ãã³ãŒããããŒãããŠå®è¡ãããªã©ãã€ã³ã¿ãŒããªã¿ãŒã®ããç¥ãããŠããæ©èœãæãåºããŠãã ããã zipã§ããã±ãŒãžåãããã¢ãžã¥ãŒã«ã®å Žåãç¶æ³ã¯å€å°ç°ãªããŸãã zipã¢ãžã¥ãŒã«ã®å Žåããã€ãã³ãŒããäºåã«çæããŠzipãã¡ã€ã«ã«ããã±ãŒãžåããå¿
èŠããããŸããããã§ãªãå Žåãã€ã³ã¿ãŒããªã¿ãŒã¯ãzipãã¡ã€ã«ããã¢ãžã¥ãŒã«ãã€ã³ããŒããããã³ã«åèµ·åãããã³ã«ã¡ã¢ãªã«ãã€ãã³ãŒããçæããŸãã ããŠã
mkpyzip.pyã¹ã¯ãªããã§ã¯ã
ãã€ãã³ãŒãçæãæ¢ã«æäŸãããŠããŸã
--mkpyc
ãªãã·ã§ã³ãè¿œå ããŠãzipãã¡ã€ã«ãåçæããã ãã§ãã
c:\Python33\python.exe d:\habr\tools\mkpyzip.py --mkpyc --src d:\habr\lib\my_sysinfo d:\habr\lib\say_hello.py --out d:\habr\output\mybundle.zip ::: d:\habr\lib\my_sysinfo\__init__.py >>> mybundle.zip/my_sysinfo/__init__.py ::: mkpyc for: d:\habr\lib\my_sysinfo\__init__.py >>> mybundle.zip/my_sysinfo/__init__.pyc ::: d:\habr\lib\my_sysinfo\sysinfo.py >>> mybundle.zip/my_sysinfo/sysinfo.py ::: mkpyc for: d:\habr\lib\my_sysinfo\sysinfo.py >>> mybundle.zip/my_sysinfo/sysinfo.pyc ::: d:\habr\lib\say_hello.py >>> mybundle.zip/say_hello.py ::: mkpyc for: d:\habr\lib\say_hello.py >>> mybundle.zip/say_hello.pyc
pythonã¢ãžã¥ãŒã«ãzipãã¡ã€ã«ã«ããã¯ããåºæ¬çãªåŽé¢ãæããã«ãªã£ãã®ã§ãmkpyzip.pyãŠãŒãã£ãªãã£èªäœã®ã³ãŒããæã¡èŸŒããšãã§ãã ãã®ã¹ã¯ãªããã«ã¯ç¹å¥ãªãã®ã¯ãªãããã€ãã³ãŒããçæããããã®ãããã¿ã€ãã¯æšæºã®pythonèšèªã©ã€ãã©ãªããåçšãããŠããããšã«ããã«æ°ä»ããŸãïŒãã®ãããã¿ã€ããæ€çŽ¢ããã«ã¯ãwr_longããŒã¯ãŒããæ€çŽ¢ããŠãã ããïŒã
mkpyzip.py import argparse import imp import io import marshal import os import os.path import zipfile def compile_file(filename, codename, out): def wr_long(f, x): f.write(bytes([x & 0xff, (x >> 8) & 0xff, (x >> 16) & 0xff, (x >> 24) & 0xff])) with io.open(filename, mode='rt', encoding='utf8') as f: source = f.read() ast = compile(source, codename, 'exec', optimize=1) st = os.fstat(f.fileno()) timestamp = int(st.st_mtime) size = st.st_size & 0xFFFFFFFF out.write(b'\0\0\0\0') wr_long(out, timestamp) wr_long(out, size) marshal.dump(ast, out) out.flush() out.seek(0, 0) out.write(imp.get_magic()) def compile_in_memory(source, codename): with io.BytesIO() as fc: compile_file(source, codename, fc) return fc.getvalue() def make_module_catalog(src): root_path = os.path.abspath(os.path.normpath(src)) root_arcname = os.path.basename(root_path) if not os.path.isdir(root_path): return [(root_path, root_arcname)] catalog = [] subdirs = [(root_path, root_arcname)] while subdirs: idx = len(subdirs) - 1 subdir_path, subdir_archname = subdirs[idx] del subdirs[idx] for item in sorted(os.listdir(subdir_path)): if item == '__pycache__' or item.endswith('.pyc'): continue item_path = os.path.join(subdir_path, item) item_arcname = '/'.join([subdir_archname, item]) if os.path.isdir(item_path): subdirs.append((item_path, item_arcname)) else: catalog.append((item_path, item_arcname)) return catalog def mk_pyzip(sources, outzip, mkpyc=False): zipfilename = os.path.abspath(os.path.normpath(outzip)) display_zipname = os.path.basename(zipfilename) with zipfile.ZipFile(zipfilename, "w", zipfile.ZIP_DEFLATED) as fzip: for src in sources: catalog = make_module_catalog(src) for entry in catalog: fname, arcname = entry[0], entry[1] fzip.write(fname, arcname) print("::: {} >>> {}/{}".format(fname, display_zipname, arcname)) if mkpyc and arcname.endswith('.py'): bytes = compile_in_memory(fname, arcname) pyc_name = ''.join([os.path.splitext(arcname)[0], '.pyc']) fzip.writestr(pyc_name, bytes) print("::: mkpyc for: {} >>> {}/{}".format(fname, display_zipname, pyc_name)) def main(): parser = argparse.ArgumentParser() parser.add_argument('--src', nargs='+', required=True) parser.add_argument('--out', required=True) parser.add_argument('--mkpyc', action='store_true') args = parser.parse_args() mk_pyzip(args.src, args.out, args.mkpyc) if __name__ == '__main__': main()
ãã€ãã³ãŒãã®æå¹æ§
ãŸããçæãããã€ãã³ãŒããæå¹ã§ãããã¢ãžã¥ãŒã«ãã€ã³ããŒããããšãã«ã€ã³ã¿ãŒããªã¿ãŒãã¡ã¢ãªã§æ°ãããã€ãã³ãŒããåçæããããšããã«æ£åžžã«ååŸããããšã確èªããæ¹æ³ã«ã€ããŠãããã€ã説æããŸãã
ãããè¡ãã«ã¯ã
__file__
say_helloã¢ãžã¥ãŒã«ã®
__file__
å±æ§
__file__
åºåããŸãã
c:\Python33\python.exe
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.insert(0,'d:\\habr\\output\\mybundle.zip') >>> import say_hello >>> say_hello.__file__ 'd:\\habr\\output\\mybundle.zip\\say_hello.pyc'
ããŒããããã¢ãžã¥ãŒã«ã®
__file__
å±æ§
__file__
çæããpycãã¡ã€ã«ãæããŠãããšããäºå®ã¯ããã€ãã³ãŒãã®æå¹æ§ã®ååãªèšŒæ ã§ãã
ããã«ãããæ確ãªè¯å¿ããã£ãŠãPythonèšèªã§ã®zipãããã³ã°ã«é¢ããå
¥éã¬ãã¥ãŒãå®äºããããšãã§ããŸãã
é©ã
ç§ã®ååã®1人ã¯ã
Eclipseãåãäžããæåãªã¢ããªã³
PyDevã®å©ããåããŠã圌ãæžããpythonã¹ã¯ãªããããããã°ããããšããŸãããããã¯ããšãããã説æãããã¯ãããžãŒã䜿çšããŠå§çž®ãããpythonã¢ãžã¥ãŒã«ã®æ©èœã䜿çšããŸããã
äž»ãªäžå¿«ãªé©ãã¯ãPyDevããã®ãããªã¢ãžã¥ãŒã«ã®ããã¥ãŒãå®å
šã«æåŠããããšã§ãã ãã®åé¡ã«åŒ·ãèå³ãæã¡ãåé¡ã®åå ãæ¢ãå§ããŸããã ããŠããã§ã«æ¯ãè¿ã£ãŠã¿ããšãPyDevã«å¯Ÿããç§ãã¡ã®ä¿¡å¿µã«ããã°ãzipã¢ãžã¥ãŒã«ã®ãããã°ã«ååãªå質ã®ãµããŒãããªããšããããšãã§ããŸãã
ããã§ãã調æ»ã®æç¹ã§ã¯ãPyDevã§ã®ãããã°ã®åŸ®åŠãªéãã¯ããã«ã¬ãã¥ãŒããé€å€ãããŸããã pythonã«çµã¿èŸŒãŸããpdbãããã¬ãŒã¯ãéåžžã«çãããçš®é¡ã®åŒã³åºãã¹ã¿ãã¯ã«é¢ããæ
å ±ãæäŸããŸããã ããã«ããœãŒã¹pyãã¡ã€ã«ãšãšãã«ããã€ãã³ãŒããå«ãpycãã¡ã€ã«ãzipã¢ãŒã«ã€ãã«ããå Žåã«ã®ã¿ãæ
å ±ã¯çãããã£ãã pyãã¡ã€ã«ã®ã¿ã®zipã¢ãŒã«ã€ãã®å Žåãèªåçæããããã€ãã³ãŒãã¯æããã«ç°ãªããã®ã§ãããpdbã§ã®ãããã°ã¯æ£ããæ
å ±ãæäŸããèŠæ
ã¯çºçããŸããã§ããã ãããã°ãé€ãããã¹ãŠãæåŸ
ã©ããã«æ©èœããŸããã ããã§ãããã€ãã³ãŒãã«ã¯ééãããããŸããã ãããŠãpdbã¯ãããæããã«ç§ãã¡ã«ç¥ãããŸããã
åé¡ã®åå ãèŠã€ãã£ãã®ã§ãpdbã®äžã§pythonã³ãŒãããããã°ãã詳现ã«é²ãæ°ã«ã¯ãªããŸããã åé¡ã®åå ãæ確ã«ããããã«ãåè¿°ã®my_sysinfoã¢ãžã¥ãŒã«ã®print_sysinfoïŒïŒé¢æ°ã䜿çšããŠãå§çž®ããããã€ãã³ãŒãããåŒã³åºãã¹ã¿ãã¯ãåå°å·ããŸãã
c:\Python33\python.exe
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.insert(0,'d:\\habr\\output\\mybundle.zip') >>> import my_sysinfo >>> my_sysinfo.print_sysinfo() -------------------------------------------------------------------------------- 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] -------------------------------------------------------------------------------- File "<stdin>", line 1, in <module> File "my_sysinfo/sysinfo.py", line 9, in print_sysinfo traceback.print_stack() --------------------------------------------------------------------------------
ã§ã¯ããã®åºåã
以åã«åãåã£
ãåºåãšæ¯èŒããŠãç¬èªã®ãã€ãã³ãŒãã®å§çž®ãéå§ããåã«ããŸãããã ããã§ã®äž»ãªéãã¯ãã¹ã¿ãã¯ãã¬ãŒã å
ã®ãã¡ã€ã«ãã¹ã§ãã
zipãã¡ã€ã«ã«ãã€ãã³ãŒãããªãå Žåã次ã®åœ¢åŒã®åºåããããŸããããã¢ãžã¥ãŒã«ãã®ãã¡ã€ã«ãstdinãã1è¡ç®
ãã¡ã€ã« "
dïŒ\ habr \ output \ mybundle.zip \ my_sysinfo \ sysinfo.py "ãprint_sysinfoã®9è¡ç®
traceback.print_stackïŒïŒ
ãããŠããã€ãã³ãŒããè¿œå ããåŸã次ã®åœ¢åŒãåããŸããããã¢ãžã¥ãŒã«ãã®ãã¡ã€ã«ãstdinãã1è¡ç®
print_sysinfoã® 9è¡
ç® ã
my_sysinfo / sysinfo.py ããã¡ã€ã«
traceback.print_stackïŒïŒ
åºåãããã³ãŒã«ã¹ã¿ãã¯ã®zipã¢ãŒã«ã€ãã«ãã€ãã³ãŒããè¿œå ãããšã絶察ãã¹ãããã¡ã€ã«ãžã®ãã¹ããããã«zipã¢ãŒã«ã€ãã®ã«ãŒãã«å¯Ÿããçžå¯Ÿãã¹ã«å€ããããšãæããã«ãªããŸãã ããã§ã泚ææ·±ãèªè
ã¯ã
mkpyzip.pyãŠãŒãã£ãªãã£ã§
compile
ããçµã¿èŸŒã¿é¢æ°ãžã®ãã®çžå¯Ÿãã¹ãéä¿¡ããããšã«ãããç§ãã¡èªèº«ããã®ãããªãã€ãã³ãŒããçæããããšã«çŽã¡ã«å察ãããããããŸããã ããããããã«ã€ããŠããå°ãæ·±ãèãããšããã®å Žåã®å®å
šãªãã¹ã¯æ±ºããŠé©åã§ã¯ãªãããšãæããã«ãªããŸãããªããªããæçµçãªç®æšã¯ããããã·ã³ã§zipã¢ãŒã«ã€ããåéããå¥ã®ãã·ã³ã§ãããããã¯å¥ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã
åœæãç§ãã¡ã¯èª°ãzipã¢ãžã¥ãŒã«ãã€ã³ã¿ãŒããªã¿ãŒã«ããŒãããå®è£
ã«ç²ŸéããŠããªãã£ããããåé¡ã®æ ¹æ¬çãªåå ã¯äœããšãã質åã«æ確ãªçããåºãããšã¯äžå¯èœã§ããã pythonã®zipã¢ãžã¥ãŒã«ããŒããŒãããŒãæã«æ£ããåäœããªããã©ããã
æçµçã«ãpython
-dev@python.orgãéããŠpythonéçºè
èªèº«ã®ã¢ããã€ã¹ãæ±ããããšã決å®ãã
ãŸãã ã åœæ圌ããç§ãã¡ã«ã¢ããã€ã¹ããã®ã¯ããã®ãããã¯ã®ãã°ãååŸããŠã説æãããåé¡ã®ã³ã³ããã¹ãã倱ãããªãããã«ããããšã ãã§ããã
ãã°bugs.python.org/issue18307ãäœæããåŸ
ã¡å§ããŸããã çŽ1ãæåŸ
æ©ããŠä»ã®åæ§ã«å·®ãè¿«ã£ãåé¡ã«åãçµãã åŸãå¿èã¯éãã«çµãããpython33.dllã¯ãããã¬ã«å
¥ããŸããã
ãã®çµæãçãã確èªãããã€ãã³ãŒãã®ããŒãæã«æ£ããåäœããªãã®ã¯ãPythonã®zipã¢ãžã¥ãŒã«ããŒããŒã®C-shnayaå®è£
ã§ãããšæèšã§ããŸãã ããæ£ç¢ºã«ã¯ãzipãã¡ã€ã«ããããŒãããããšãã«ãã€ãã³ãŒãå
ã®ãã¹ã®èªåæ£èŠåãå¿
èŠãšããããã§èª¬æãããŠããã±ãŒã¹ã¯ãåã«å®è£
ãããŠããŸããã ãã®çµæãåããã°ã®äžéšãšããŠããã®åé¡ãä¿®æ£ããã³ãŒã«ã¹ã¿ãã¯å
ã®ãã¡ã€ã«ãã¹ã絶察圢åŒã«å°ãããããææ¡ããŸããã
çŽå幎åŸã
bugs.python.orgã®ãã®ãã°ã¯å
¬éããããŸãŸã§ãã ã©ãããpythonã®zipã¢ãžã¥ãŒã«ã¯æ©èœã§ããã匷åã§ããããã£ãã«äœ¿çšãããªããããç¹ã«zipã¢ãŒã«ã€ãå
ã®ãã€ãã³ãŒãã®å Žåã¯ããã§ãã ããã«ãããããããPythonãœãŒã¹ãå«ãç¬èªã®ãªããžããªïŒå
¬éå
ã«ã§ããã ãè¿ã¥ããããã«ããŠããŸãïŒã䜿çšããŠããã®ãããã«å°å¿µããŸããã
ãããã«
zipã¢ãŒã«ã€ãã«ããã±ãŒãžåãããPythonã®ã¢ãžã¥ãŒã«ã¯ãå±éããã圢åŒãšåæ§ã«æ©èœããŸãã æºåãå¿
èŠãªã®ã¯ãããã±ãŒãžååŸãEclipse + PyDevãšä»ã®IDEã®äž¡æ¹ã§ãããã°ããã®ãé£ããå Žåãããããšã§ãããããã°ãPyDevã«åºã¥ããŠããŸãã ããã«ãããããããç¹å®ã®ç¶æ³ã§ã¯ãIDEã§Pythonã³ãŒããç°¡åã«ãããã°ãããããããã€ããªã®çç£ã¢ãžã¥ãŒã«ã®ã³ã³ãã¯ããªã»ãããæã€èœåã®æ¹ãéèŠã«ãªãå ŽåããããŸãã
PS setuptools / eggsãçºæããŸãããïŒ ãã
Pythonã®Zipã¢ãžã¥ãŒã«ã¯å®å
šã«ç¬ç«ããèªçµŠèªè¶³ã®æ©èœã§ãããèšèªã€ã³ã¿ãŒããªã¿ãŒèªäœã®ã³ã¢ã«çµã¿èŸŒãŸããŠããŸãã setuptools / eggsã¯ãæãåºãç¥ãããŠãããŠãŒã¹ã±ãŒã¹ã§ãã