【问题标题】:cx_freeze & pygobject in a subdirectory子目录中的 cx_freeze 和 pygobject
【发布时间】:2014-02-18 01:04:52
【问题描述】:

我有一个使用 py27 和 pygtk 的小型 py 程序。我可以用 cx_freeze 非常高兴地冻结它。

我一直在尝试将其“移植”到 py33 和 pygobject。这已经非常成功地完成了,我并没有尝试调整我的 setup.py cx_freeze 脚本来“冻结”应用程序。

我可以冻结一个测试应用程序,但是当我尝试使用我的调整版本时,我收到了 ImportError。我所做的是将所有二进制数据放入子目录(bin)中,以尽量保持根目录不那么混乱。

如前所述,这适用于 py27 和 pygtk。

我已将其缩小为一个简单的 py 和设置来演示这一点:

测试.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:

ERROR:root:Could not find any typelib for Gtk 回溯(最近一次通话最后): 文件“c:\Python33\lib\site-packages\cx_Freeze\initscripts\Console3.py”,第 27 行,在 exec(code, m.dict) 文件“test.py”,第 19 行,在 ImportError: 无法导入名称 Gtk

我已经检查过 typelib 文件存在,但无论出于何种原因 python & gi 都找不到它们。我认为这可能是 girepository 的缺失路径,但这并没有解决它。 有什么想法吗?

【问题讨论】:

    标签: python cx-freeze pygobject


    【解决方案1】:
    os.environ['GI_TYPELIB_PATH'] = os.path.join(os.path.dirname(sys.executable),'bin\\lib\girepository-1.0')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多