2012-11-30 47 views
3

我有一個python腳本,它使GUI。當按鈕「運行」在該GUI被按下它運行從導入的包(我製造)這樣如何添加多個文件到py2app?

from predictmiP import predictor 
class MiPFrame(wx.Frame): 
    [...] 
    def runmiP(self, event): 
     predictor.runPrediction(self.uploadProtInterestField.GetValue(), self.uploadAllProteinsField.GetValue(), self.uploadPfamTextField.GetValue(), \ 
        self.edit_eval_all.Value, self.edit_eval_small.Value, self.saveOutputField) 

的函數當我從蟒直接運行的GUI這一切工作良好,程序寫入的輸出文件。但是,當我將它製作成應用程序時,GUI會啓動,但是當我按下按鈕時,什麼也沒有發生。與我正在使用的所有其他導入一樣,predictmiP確實包含在build/bdist.macosx-10.3-fat/python2.7-standalone/app/collect /中(儘管它是空的,但與所有其他導入一樣我有)。

如何獲得多個python文件或導入的包與py2app一起使用?

我setup.py:

「」 「 這是py2applet

用法產生一個setup.py腳本: 蟒蛇setup.py py2app 」「」

from setuptools import setup 

APP = ['mip3.py'] 
DATA_FILES = [] 
OPTIONS = {'argv_emulation': True} 

setup(
    app=APP, 
    data_files=DATA_FILES, 
    options={'py2app': OPTIONS}, 
    setup_requires=['py2app'], 
) 

編輯:

它看起來編輯喜歡它的工作,但它只適用於一點點。從我的GUI我打電話

blast.makeBLASTdb(self.uploadAllProteinsField.GetValue(), 'allDB') 

# to test if it's working 
dlg = wx.MessageDialog(self, "werkt"+self.saveOutputField, "werkt", wx.OK) 
dlg.ShowModal() # Show it 
dlg.Destroy() # finally destroy it when finished. 

blast.makeBLASTdb看起來是這樣的:

def makeBLASTdb(proteins_file, database_name): 
    subprocess.call(['/.'+os.path.realpath(__file__).rstrip(__file__.split('/')[-1])+'blast/makeblastdb', '-in', proteins_file, '-dbtype', 'prot', '-out', database_name]) 

這個函數被調用,makeblastdb我通過調用子確實輸出的文件。然而,程序不會繼續,

dlg = wx.MessageDialog(self, "werkt"+self.saveOutputField, "werkt", wx.OK) 
dlg.ShowModal() # Show it 

在接下來的行永遠不會被執行。

+0

你的setup.py在哪裏?這個預測模塊/包是什麼?純Python還是什麼? – mmgp

+0

它是純Python。我將編輯我的問題以包含我的setup.py –

+0

將問題簡化爲一個獨立的示例,以獲得更準確的幫助。 – mmgp

回答

6

py2app(或者說,setup.py)不會神奇地包含文件,只是因爲您將它們導入到您的應用程序代碼中。

從您的描述中,我不太清楚predictmiP.py文件的位置,mip3.py文件所在的位置,setup.py文件所在的位置以及目錄樹剩餘部分的外觀。

因此,關於打包Python文件的一些常規說明(另請參閱http://docs.python.org/2.7/distutils/index.html)。如果你只是有幾個文件,可以明確的列出它們:

setup(
    py_modules=['file1', 'file2'] 
) 

這將包括file1.py和​​。如果你有很多文件,那當然是枯燥乏味的,所以你可以告訴設置。PY包括所有Python文件發現,像這樣:

setup(
    package='example', 
) 

這需要一個名爲example目錄,包含一個__init__.py,並且將包括在那裏發現所有的Python文件。

如果您有不同的目錄佈局,例如含有Python文件一個src目錄,將其設置是這樣的:

setup(
    package='example', 
    package_dir={'': 'src'} 
) 

這需要一個目錄src/example,並且包括以下的有Python文件。

+1

py2app在運行'python setup.py py2app'構建一個包之後會「神奇地」包含模塊和包。它不包含在setup.py中,但應該在最終捆綁包中。但我不確定他是否構建了一個捆綁包。 – mmgp

+0

添加python包工作正常,我遇到了一個不同的問題,應用程序在命令行工具完成後沒有繼續,但我需要爲此提出一個不同的問題。感謝您的回答。 –

4

由於沒有設置你的setup.py,我想這不象是這樣的:

from setuptools import setup 

OPTIONS = {'packages' : ['predictmiP']} 

setup(app=someapp.py, options={'py2app' : OPTIONS}, 
     setup_requires=['py2app']) 

或者,也許你正在尋找OPTIONS['includes']?或者,也許OPTIONS['frameworks']

+0

做到了..謝謝!所以我必須添加我想要導入到包列表中的每個包? –

+0

直到你添加你的setup.py,我不知道你正在使用py2app。然後,當我看到你正在使用py2app時,我有點困惑,因爲它應該檢測導入的軟件包/模塊並將它們包含在軟件包中。運行'python setup.py py2app'生成的包時會出錯嗎?它可能是一個py2app錯誤。另一方面,我認爲這是一件好事,因爲我更喜歡直接指定我正在使用的內容,而不是浪費時間與依賴關係跟蹤器。 – mmgp

+0

不,我不這樣做,程序剛剛啓動,但是當我按下運行按鈕時,它什麼也不做。現在我使用包選項,它確實是 –