2014-02-18 13 views
3

我有一個小py程序,它使用py27 & pygtk。我可以很快樂地用cx_freeze來凍結這個。cx_freeze&pygobject在子目錄中

我一直在試圖「移植」到py33 & pygobject。這已經非常成功地完成了,我並沒有試圖讓我的setup.py cx_freeze腳本現在「凍結」應用程序。

我能夠凍結一個測試應用程序,但當我然後嘗試使用我的調整版本時,我收到一個ImportError。我所做的是將所有的二進制數據放入一個子目錄(bin)中,以儘量減少根目錄的亂碼。

如上所述,這可以很好地與py27 & pygtk。

我已經縮小它DOWNTO簡單PY和設置,以證明這一點:

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 build 然後執行dist/test.exe我已經打印到控制檯:

錯誤:根:無法找到任何類型庫爲Gtk 回溯(最近調用最後一次): 文件「c:\ Python33 \ lib \ site-packages \ cx_Freeze \ initscripts \ Console3.py」,第27行,在 exec(code,m。 字典) 文件「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')