2011-10-09 65 views
7

我是一名python程序員,我試圖構建一個可執行的二進制代碼來將我的軟件分發給我的客戶,即使它不完全可執行,我希望能夠將軟件分發到這樣便於最終用戶使用。Python - 構建可執行文件時遇到問題

我已經嘗試了PyInstaller以及Py2Exe,並且我正面臨着與特定軟件相同的問題。

我使用了我的程序的分裂模塊(當然這是一個新的高級框架與Selenium等其他框架交互),每次我嘗試編譯它時,似乎都有一個名爲「webdriver.xpi」的文件。這總是從最終的軟件包中排除,因此當程序嘗試執行網絡驅動程序時,它會失敗並顯示IO Error指示文件「webdriver.xpi」未找到....但除此之外,GUI和一切都很好。

那麼有沒有辦法包括它甚至手動?我嘗試通過瀏覽到特定的文件夾@ library.zip文件手動包括它,但它沒有工作。

我在這件事情上並不是真正的專家,我依靠GUI2Exe來構建一切......如果可能的話,我會非常感謝一些建議,以解決這個問題。

謝謝。

+0

你可以告訴你的setup.py腳本用於py2exe? – chown

+0

在運行它之前,您不能只將文件添加到應用程序目錄嗎? – Fenikso

回答

1

您需要在您的setup.py中有說明才能在發佈中包含任何資源文件。有幾種方法可以做到這一點(請參閱distutils,setuptools,發佈 - 取決於您用於構建發行版的內容),但py2exe wiki有example

如果您將它們安裝到您的exe文件所在的目錄中,您可能需要使用this py2exe tip來查找您的資源。

請參閱this answer瞭解有關在發行版中包含資源文件的其他信息。

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目錄

那應該這樣做。

+1

我同意aknatn,很久以前我發現這個問題的解決方案,但完全忘了我在這裏發佈了這個問題。主要的解決方案是使用GUI2Exe之類的GUI構建器完成的任何操作,只要確保最終的軟件包沒有壓縮或其他任何內容,並且所有內容都可以解壓縮到您可以手動添加.xpi文件的文件夾中並使其工作。後來,我使用類似NSIS的東西把它打包成一個很酷的安裝嚮導,包含許可證協議,密鑰文件等,以便將它分發給第三方。我必須說我從亂搞中學到很多東西,試圖讓Python工作:) –

+0

謝謝,怎麼樣的投票;-) – aknatn

+0

大聲笑我沒有嘗試過......它說投票要求15聲望xD –

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的信息。

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, 

) 
+0

當我嘗試你的腳本時,吐出關於SIP的錯誤。沒有定義或未知 –