2014-02-18 3 views
3

py27 & pygtk를 사용하는 작은 py 프로그램이 있습니다. 이것을 cx_freeze로 아주 행복하게 고정 할 수 있습니다.서브 디렉토리에있는 cx_freeze & pygobject

저는 이것을 "py33"에 "포트"하려고 시도했습니다. & pygobject. 이 작업이 성공적으로 완료되었으며 setup.py cx_freeze 스크립트를 적용하여 응용 프로그램을 "고정"하려고하지 않았습니다.

테스트 응용 프로그램을 고정 할 수는 있지만 트윅 된 버전을 사용하려고 시도 할 때 ImportError가 발생합니다. 내가 한 일은 모든 바이너리 데이터를 하위 디렉토리 (bin)로 이동시켜 루트를 조금 덜 어둡게 유지하려고 시도한 것입니다.

언급 한 바와 같이 이것은 py27 & pygtk에서 잘 작동합니다.

나는이 설명하는 간단한 평 및 설정 downto을 축소 한 :

TEST.py을

######################################################################## 
import os 
import sys 

if getattr(sys,'frozen',False): 
    # if trap for frozen script wrapping 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin')) 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin\\etc')) 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin\\lib')) 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin\\share')) 
    sys.path.append(os.path.join(os.path.dirname(sys.executable),'bin\\library.zip')) 
    os.environ['TCL_LIBRARY'] = os.path.join(os.path.dirname(sys.executable),'bin\\tcl') 
    os.environ['TK_LIBRARY'] = os.path.join(os.path.dirname(sys.executable),'bin\\tk') 
    os.environ['MATPLOTLIBDATA'] = os.path.join(os.path.dirname(sys.executable),'bin\\mpl-data') 

import gi 
import gi.repository 
from gi.repository import Gtk 
####################################################################### 

지금 setup.py

######################################################################## 
from cx_Freeze import setup, Executable 
import sys 
import site 
import os 

site_dir = site.getsitepackages()[1] 
include_dll_path = os.path.join(site_dir, "gnome") 

missing_dll = ['libgtk-3-0.dll', 
       'libgdk-3-0.dll', 
       'libatk-1.0-0.dll', 
       'libcairo-gobject-2.dll', 
       'libgdk_pixbuf-2.0-0.dll', 
       'libjpeg-8.dll', 
       'libpango-1.0-0.dll', 
       'libpangocairo-1.0-0.dll', 
       'libpangoft2-1.0-0.dll', 
       'libpangowin32-1.0-0.dll', 
       'libgnutls-26.dll', 
       # 'libgcrypt-11.dll', 
       #'libp11-kit-0.dll' 
] 
gtk_libs = ['etc', 'lib', 'share'] 
include_files = [] 
for dll in missing_dll: 
    include_files.append((os.path.join(include_dll_path, dll), dll))  

for lib in gtk_libs: 
    include_files.append((os.path.join(include_dll_path, lib), lib))   

includes = ['gi'] 
excludes = ['wx','email','pydoc_data','curses'] 
packages = ['gi'] 
sys.path.append(os.path.join(os.path.dirname(__file__), '.', 'bin')) 



EXE1 = Executable(
    script = "test.py", 
    initScript = None, 
    base = 'Console', 
    targetDir = "dist", 
    targetName = "test.exe", 
    compress = True, 
    copyDependentFiles = True, 
    appendScriptToExe = True, 
    appendScriptToLibrary = False, 
    ) 

setup(

    version = "9999", 
    description = "test", 
    author = "jrb", 
    name = "test", 

    options = {"build_exe": {"includes": includes, 
          "excludes": excludes, 
          "packages": packages, 
          'include_files':include_files, 
          "path": sys.path, 

          'append_script_to_exe':False, 
          'build_exe':"dist/bin", 
          'compressed':True, 
          'copy_dependent_files':True, 
          'create_shared_zip':True, 
          'include_in_shared_zip':True, 
          'optimize':2, 
          } 
       }, 

    executables = [EXE1] 
    ) 
######################################################################## 

내가 실행 :/C/Python33/python -OO setup.py 빌드 그리고 나서 dist/test.exe를 실행합니다. 콘솔에 출력했습니다 :

오류 : 루트 : Gtk에 대한 typelib을 찾을 수 없습니다. 추적 (가장 최근 호출 마지막) : 파일 "c : \ Python33 \ lib \ site-packages \ cx_Freeze \ initscripts \ Console3.py"파일의 exec (code, m. ImportError를에 DICT) 파일 "test.py", 줄 19 : 이름은 Gtk

내가 확인하고 형식 라이브러리 파일이 존재하지만 & GI 그들을 찾을 수없는 어떤 이유로 파이썬을 가져올 수 없습니다. 나는 그것이 girepository에 대한 누락 된 경로일지도 모른다고 생각했지만 해결하지는 못했습니다. 아이디어가 있으십니까?

답변

2
os.environ['GI_TYPELIB_PATH'] = os.path.join(os.path.dirname(sys.executable),'bin\\lib\girepository-1.0')