【问题标题】:How to add multiple files to py2app?如何将多个文件添加到py2app?
【发布时间】:2012-11-30 23:20:04
【问题描述】:

我有一个制作 GUI 的 python 脚本。当在此 GUI 中按下“运行”按钮时,它会像这样从导入的包(我制作)中运行一个函数

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)

当我直接从 python 运行 GUI 时,一切正常,程序编写了一个输出文件。然而,当我把它变成一个应用程序时,GUI 会启动,但是当我按下按钮时没有任何反应。 predictmiP 确实包含在 build/bdist.macosx-10.3-fat/python2.7-standalone/app/collect/ 中,就像我正在使用的所有其他导入一样(虽然它是空的,但这与所有其他导入相同我有)。

如何获取多个 python 文件或导入的包以与 py2app 一起使用?

我的 setup.py:

""" 这是py2applet生成的setup.py脚本

用法: python 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

在接下来的行中永远不会被执行。

【问题讨论】:

  • 你的 setup.py 在哪里?这个 predictmiP 模块/包是什么?纯 Python 还是什么?
  • 纯python。我将编辑我的问题以包含我的 setup.py
  • 将问题简化为一个独立的示例以获得更准确的帮助。
  • 是的,我需要为此提出一个新问题。现在可以导入包了,谢谢。

标签: python import package py2app


【解决方案1】:

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.pyfile2.py。如果你有很多文件,那当然会很乏味,所以你可以告诉 setup.py 包含它找到的所有 Python 文件,如下所示:

setup(
    package='example',
)

这需要一个名为 example 的目录,其中包含一个 __init__.py,并将包含在那里找到的所有 Python 文件。

如果您有不同的目录布局,例如包含 Python 文件的 src 目录,设置如下:

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

这需要一个目录src/example,并包含下面的 Python 文件。

【讨论】:

  • py2app 在你运行python setup.py py2app 构建一个包之后“神奇地”包含模块和包。它不包含在 setup.py 中,但应该包含在最终包中。但我不确定他是否构建了一个捆绑包。
  • 添加 python 包正在工作,我遇到了一个不同的问题,即在命令行工具完成后应用程序无法继续,但我需要为此提出一个不同的问题。谢谢你的回答。
【解决方案2】:

由于没有提供您的 setup.py,我猜它不像:

from setuptools import setup

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

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

或者您正在寻找OPTIONS['includes']?或者OPTIONS['frameworks']

【讨论】:

  • 做到了..谢谢!所以我必须将要导入的每个包添加到包列表中?
  • 在您添加 setup.py 之前,我不知道您使用的是 py2app。然后在我看到你在使用 py2app 之后,我有点困惑,因为它应该检测导入的包/模块并将它们包含在包中。运行 python setup.py py2app 生成的包时是否出现错误?这可能是一个 py2app 错误。另一方面,我发现这通常是一件好事,因为我更喜欢直接指定我正在使用的内容,而不是在依赖跟踪器上浪费时间。
  • 不,我没有,程序刚刚启动,但是当我按下运行按钮时,它什么也没做。现在我使用了它的 package 选项
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多