2012-11-30 45 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

不,我不这样做,程序刚刚启动,但是当我按下运行按钮时,它什么也不做。现在我使用包选项,它确实是 –