【问题标题】:Python - Trouble in building executablePython - 构建可执行文件时遇到问题
【发布时间】:2011-12-03 20:24:28
【问题描述】:

我是一名 python 程序员,我正在尝试构建一个可执行的二进制文件来将我的软件分发给我的客户,即使它不是完全可执行的我希望能够以一种方便的方式分发我的软件最终用户。

我已经尝试过 PyInstaller 和 Py2Exe,但我在使用特定软件时遇到了同样的问题。

我在我的程序中使用了 splinter 模块(它当然是一个新的高级框架,可以与 Selenium 等其他框架进行交互),每次我尝试编译它时,似乎都有一个名为“webdriver.xpi”的文件总是从最终包中排除,因此当程序尝试执行 web 驱动程序时,它会失败并显示 IO 错误,指出找不到文件“webdriver.xpi”......但除 GUI 和所有内容之外工作得很好。

那么有没有办法手动包含它?我尝试通过浏览到特定文件夹 @ library.zip 文件来手动包含它,但它不起作用。

我不是这方面的专家,我依靠 GUI2Exe 来构建一切......如果可能的话,我非常感谢一些关于如何解决这个问题的建议。

谢谢。

【问题讨论】:

  • 你能显示你用于 py2exe 的 setup.py 脚本吗?
  • 你不能在运行之前将文件添加到应用程序目录吗?

标签: python selenium wxpython


【解决方案1】:

我整天都在做这件事,并找到了一种解决方法,它很狡猾,但它确实有效。在我收到的错误消息中,我注意到库 .zip 之间有一个空格。我无法在 py2exe 或 selenium 的源代码中找到它。我也曾尝试将 xpi 文件放入库 zip 中,但它不起作用。解决方法是:

  1. 在您的设置文件中使用以下选项:

    setup(
        console=['yourFile.py'],
        options={
                "py2exe":{
                        "skip_archive": True,
                        "unbuffered": True,
                        "optimize": 2
                }
        }
    )
    
  2. 运行 py2exe 安装

  3. 将xpi文件复制到dist目录中

应该可以的。

【讨论】:

  • 我同意aknatn,我很久以前就找到了解决这个问题的方法,但完全忘记了我在这里发布了这个问题。主要的解决方案是,即使使用 GUI2Exe 之类的 gui 构建器,您也可以执行任何操作,只需确保最终包没有压缩或任何内容,并且所有内容都解压在一个文件夹中,您可以手动添加 .xpi 文件并使其工作。后来我用 NSIS 之类的东西把它打包成一个很酷的安装向导,带有许可协议、密钥文件等,以将其分发给第三方。我必须说我从搞砸中学到了很多东西,试图让 Python 工作:)
  • 大声笑我确实尝试过...它说投票需要 15 声望 xD
  • 与其手动复制,不如使用py2exe设置选项datafiles=[('path/copy/them/to', ['list/of/file/paths/this.txt'])]
【解决方案2】:

您需要在您的setup.py 中包含一条说明,以在您的分发版中包含任何资源文件。有几种方法可以做到这一点(参见 distutils、setuptools、distribute - 取决于您用于构建分发的内容),但 py2exe wiki 有一个 example

如果要将资源安装到与 exe 相同的目录中,则可能需要使用 this py2exe tip 来查找资源。

请参阅this answer,了解有关在您的发行版中包含资源文件的更多信息。

【讨论】:

    【解决方案3】:

    以下是您问题的解决方案: 我稍微修改了一个代码,它应该可以工作,因为我遇到了同样的问题并且我解决了它:

    from distutils.core import setup
    import py2exe
    
    wd_base = 'C:\\Python27\\Lib\site-packages\\selenium-2.44.0-py2.7.egg    \\selenium\\webdriver'
    RequiredDataFailes = [
    ('selenium/webdriver/firefox', ['%s\\firefox\\webdriver.xpi'%(wd_base), '%s\\firefox\\webdriver_prefs.json'%(wd_base)])
    ]
    
    setup(
    windows=[{"script":"gui_final.py"}],options={"py2exe":{"skip_archive": True,"includes":["sip"]}},
    data_files=RequiredDataFailes,
    
    )
    

    【讨论】:

    • 当我尝试你的脚本时,它吐出一个关于 sip 的错误。未定义或未知
    【解决方案4】:

    我知道这是旧的,但我想提供一个更新的答案以避免建议程序员手动执行某些操作。

    有一个py2exe 选项可以将数据文件列表指定为元组。 (pathtocopyto, [list of files and where to get them])

    例子:

    from disutils.core import setup
    import py2exe
    
    wd_base = 'C:\\Python27\\Lib\\site-packages\\selenium\\webdriver'
    RequiredDataFailes = [
        ('selenium/webdriver/firefox', ['%s\\firefox\\webdriver.xpi'%(wd_base), '%s\\firefox\\webdriver_prefs.json'%(wd_base)])
    ]
    
    setup(
        console=['MyScript.py'],
        data_files=RequiredDataFiles,
        options={
            **mypy2exeopts
        }
    )
    

    我目前知道的唯一缺点是您仍然需要skip_archive = True。有一些解决方法可以在 library.zip 中获取数据文件,但我对 webdriver 的信息不太满意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2019-09-07
      • 2011-11-14
      • 2018-07-20
      • 2019-03-11
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多