【问题标题】:py2exe - Create single executable file out of a folderpy2exe - 从文件夹中创建单个可执行文件
【发布时间】:2014-06-02 13:34:01
【问题描述】:

你好 Stackoverflowers,

我一直在尝试从包含 python 脚本和其他一些模块和文件的文件夹中创建单个可执行文件(注意:如果这很重要,我也在使用 Tkinter)。

我已经查看了 很多 与此相关的问题/答案并尝试了它们,但它们似乎都不适合我。

这是我的文件夹的样子:

python-calendar                #base-folder
|
|___apliclient                 #module
|___httplib2                   #module
|___oauth2client               #module
|___uritemplate                #module
|___client_secrets.json        #used by program.py
|___program.py                 #my main script
|___program.dat                #updated by program.py

我的问题是:
如何创建一个可执行文件,将所有这些文件/文件夹组合成一个可以运行的独立可执行文件?

这是我的setup.py 文件在py2exe 安装程序中的样子,但是当我运行我的可执行文件时,没有任何反应(来自文件夹和命令行)。

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True, "includes" : ['apiclient','httplib2','oauth2client',
                        'uritemplate'] }},
    console = ["program.py"],
    zipfile = None,
    data_files=['client_secrets.json']
)

任何关于如何为此或任何其他可执行创建者使用py2exe 的指导都会非常有帮助。提前谢谢你。

【问题讨论】:

    标签: python executable py2exe pyinstaller


    【解决方案1】:

    我找到了部分解决方案。首先,像这样修改你的 setup.py:

    from distutils.core import setup
    import py2exe, sys, os
    
    sys.argv.append('py2exe')
    PROGRAM_DAT     = open('program.dat').read()
    CLIENT_SECRETS  = open('client_secrets.json').read()
    
    setup(windows=[{'script': "program.py",
                'other_resources': [
                     (u'PROGRAM_DAT', 1, PROGRAM_DAT), 
                     (u'CLIENT_SECRETS', 2, CLIENT_SECRETS) 
                ]
               }],
                options = {'py2exe': {'bundle_files': 1, 'compressed': True, "includes" : ['apiclient','httplib2','oauth2client',
                        'uritemplate']}
               },
    
               zipfile = None
     )
    

    如果您想构建控制台应用程序,只需将setup(windows= 更改为setup(console=

    在 program.py 中你可以像这样加载资源:

    import win32api
    from StringIO import StringIO
    
    datfile = StringIO( win32api.LoadResource(0, u'PROGRAM_DAT', 1))
    print datfile.getvalue()
    
    secrets = StringIO( win32api.LoadResource(0, u'CLIENT_SECRETS', 2))
    print secrets.getvalue()
    

    但是没有办法从program.exe修改program.exe。要将您的更改保存在嵌入式 program.dat 中,您将需要另一个 exe 文件。然后,您可以使用win32api.BeginUpdateResourcewin32api.UpdateResourcewin32api.LoadResource 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2013-11-20
      相关资源
      最近更新 更多