2013-12-24 57 views
2

目前我正在使用pyinstaller打包我的python应用程序。我同样迁移到pyGObject(由于pygtk被折旧)。cx_freeze&打包文件

现在,pyinstaller不支持pyGObject,我还没有找到所需的钩子... pyinstaller的其他缺点之一是它如何绑定到单个可执行文件 - 它会导致公司安装的病毒扫描程序检查每次运行exe时都相当集中==>启动速度很慢。

纵观pygObject的使用cx_freeze & py3支持我注意到它没有单一的可执行选项。如果可以清理工作目录,这本身不是问题,可以通过将pyd/dll捆绑到第二个zip文件或子目录中。

搜索周围(stackoverflow和其他网站),它可以做到,但我没有得到预期的结果。有任何想法吗?

setup.py是基于围绕这一:http://wiki.wxpython.org/cx_freeze

+0

通过'build_exe':“dist/data”我已经能够将dll/pyd文件整理到一个子目录中,但是我现在收到导入错误。将sys.path + ['./ data']添加为路径选项不能解决此问题。 – Naib

+1

pyd/dll文件是编译库,不能从zip文件中加载(尽管可以在程序需要它们之前从压缩文件中提取它们)。更改'sys.path'应该可以用于pyd文件,但是很难更改DLL加载的位置 - 请参阅[此MSDN文档页面](http://msdn.microsoft.com/zh-cn/library/windows/desktop /ms682586%28v=vs.85%29.aspx#search_order_for_desktop_applications)。 –

回答

5

OK解决:

1)setup.py

import sys 
from cx_Freeze import setup, Executable 
EXE1 = Executable(
    # what to build 
    script = "foo.py", 
    initScript = None, 
    base = 'Win32GUI', 
    targetDir = "dist", 
    targetName = "foo.exe", 
    compress = True, 
    copyDependentFiles = True, 
    appendScriptToExe = True, 
    appendScriptToLibrary = False, 
    icon = 'foo.ico' 
    ) 

setup(
    version = "9999", 
    description = "...", 
    author = "...", 
    name = "...", 

    options = {"build_exe": {"includes": includes, 
          "excludes": excludes, 
          "packages": packages, 
          "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] 
    ) 

2)foo.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\\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')