Python - 构建可执行文件的麻烦

时间:2011-10-09 06:42:13

标签: python selenium wxpython

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

我已经尝试过PyInstaller以及Py2Exe,我遇到了与特定软件相同的问题。

我为我的程序使用了splinter模块(当然这是一个与Selenium等其他框架交互的新高级框架),每次我尝试编译它时,似乎都有一个名为“webdriver.xpi”的文件总是被遗漏在最终的包中,因此当程序试图执行web驱动程序时,它失败并出现IO错误,表示找不到文件“webdriver.xpi”....但除了GUI和所有内容之外完美无缺。

有没有办法甚至手动包含它?我尝试通过浏览到特定文件夹@ library.zip文件手动包含它,但它没有用。

我在这方面并不是真正的专家,我依靠GUI2Exe来构建所有内容......如果可能的话,我真的很感激如何解决这个问题。

感谢。

4 个答案:

答案 0 :(得分:10)

我整天都在这里,发现了一个解决方法,这是偷偷摸摸的,但它确实有效。在我收到的错误消息中,我注意到库.zip之间有一个空格。我无法在py2exe或selenium的源代码中追踪它。我也尝试将xpi文件放在库zip中,但它没有用。解决方法是:

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

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

  3. 将xpi文件复制到dist目录
  4. 应该这样做。

答案 1 :(得分:1)

您需要setup.py中的说明才能在您的发行版中包含任何资源文件。有两种方法可以执行此操作(请参阅distutils,setuptools,distribute - 取决于您用于构建发行版的内容),但py2exe wiki有example

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

有关在您的发布中包含资源文件的其他信息,请参阅this answer

答案 2 :(得分:1)

以下是您的问题的解决方案: 我修改了一些代码,它应该可以工作,因为我有同样的问题,我解决了它:

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,

)

答案 3 :(得分:0)

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

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的信息没有太多运气。

相关问题