Как добавить несколько файлов в py2app?

У меня есть скрипт python, который создает графический интерфейс. Когда в этом графическом интерфейсе нажимается кнопка «Выполнить», она запускает функцию из импортированного пакета (который я сделал), например

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, все работает хорошо, и программа записывает выходной файл. Однако, когда я превращаю его в приложение, запускается графический интерфейс, но когда я нажимаю кнопку, ничего не происходит. PredictmiP включается в build/bdist.macosx-10.3-fat/python2.7-standalone/app/collect/, как и все другие импорты, которые я использую (хотя он пуст, но он такой же, как и все остальные импорты). У меня есть).

Как я могу получить несколько файлов python или импортированный пакет для работы с py2app?

мой setup.py:

""" Это сценарий setup.py, сгенерированный py2applet.

Использование: 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'],
)

редактировать:

Вроде работало, но работает недолго. Из моего графического интерфейса я звоню

 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

в следующих строках никогда не выполняется.


person Niek de Klein    schedule 30.11.2012    source источник
comment
Где находится ваш setup.py? Что это за модуль/пакет прогнозирования? Чистый питон что ли?   -  person mmgp    schedule 05.12.2012
comment
это чистый питон. Я отредактирую свой вопрос, чтобы включить мой setup.py   -  person Niek de Klein    schedule 06.12.2012
comment
Сократите проблему до отдельного примера для более точной помощи.   -  person mmgp    schedule 06.12.2012
comment
Да, мне нужно будет сделать новый вопрос для этого. Импорт пакетов теперь работает, спасибо.   -  person Niek de Klein    schedule 10.12.2012


Ответы (2)


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 и file2.py. Если у вас много файлов, это, конечно, утомительно, поэтому вы можете указать setup.py включить все найденные файлы Python, например:

setup(
    package='example',
)

Это предполагает каталог с именем example, содержащий __init__.py, и будет включать все найденные там файлы Python.

Если у вас другой макет каталога, например. каталог src, содержащий файлы Python, установите его следующим образом:

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

Это ожидает каталог src/example и включает в себя файлы Python ниже.

person wosc    schedule 09.12.2012
comment
py2app волшебным образом включает модули и пакеты после того, как вы запустите python setup.py py2app для создания пакета. Он не входит в setup.py, но должен быть включен в окончательный пакет. Но я не совсем уверен, собрал он связку или нет. - person mmgp; 09.12.2012
comment
Добавление пакета python работает, у меня другая проблема с приложением, которое не продолжается после завершения работы инструмента командной строки, но для этого мне нужно задать другой вопрос. Спасибо за Ваш ответ. - person Niek de Klein; 10.12.2012

Поскольку ваш setup.py не указан, я предполагаю, что он не похож на что-то вроде:

from setuptools import setup

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

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

Или, может быть, вы ищете OPTIONS['includes'] ? Или, может быть, OPTIONS['frameworks']?

person mmgp    schedule 04.12.2012
comment
это сделало это .. спасибо! так что я должен добавить каждый пакет, который я хочу импортировать, в список пакетов? - person Niek de Klein; 06.12.2012
comment
Пока вы не добавили свой setup.py, я понятия не имел, что вы используете py2app. Затем, когда я увидел, что вы используете py2app, я немного запутался, потому что он должен обнаруживать импортированные пакеты/модули и включать их в комплект. Вы получаете сообщение об ошибке при запуске пакета, созданного python setup.py py2app? Это может быть ошибка py2app. С другой стороны, я считаю, что в целом это хорошо просто потому, что я предпочитаю прямо указывать, что я использую, а не тратить время на средства отслеживания зависимостей. - person mmgp; 06.12.2012
comment
Нет, программа просто запускается, но когда я нажимаю кнопку запуска, она ничего не делает. Теперь, когда я использую вариант пакета, он делает - person Niek de Klein; 06.12.2012