Перед загрузкой информации о некоторых системах/программных средствах:
ОС: Mac OS X 10.7.1
Python: активный Python 2.7.2.5
wxPython: wxPython2.9-osx-2.9.1.1-cocoa-py2.7
У меня небольшое приложение на базе wxpython для Mac, которое просто проверяет наличие cvs и svn на платформе Mac. Это код python, на котором основано приложение Mac:
import wx
import commands,os
ID_RUN_BUTTON=1
class Frame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(100, 100),style=wx.MINIMIZE_BOX | wx.CLOSE_BOX)
self.run_button=wx.Button(self,ID_RUN_BUTTON,label='Run')
self.Bind(wx.EVT_BUTTON, self.OnRun,id=ID_RUN_BUTTON)
self.Centre()
self.Show()
def OnRun(self,evt):
home_dir=os.path.expanduser("~")
a=commands.getoutput("cvs")
b=commands.getoutput("svn help")
f=open('%s/cvs_test' % (home_dir),'w')
f.write(a)
f.write('\n')
f.write(b)
f.close()
if __name__ == '__main__':
app = wx.App(redirect=False)
frame = Frame(None, -1, 'CVS Tester')
app.MainLoop()
Вот скриншот этого простого графического интерфейса с одной кнопкой "Выполнить".
При нажатии "Выполнить" он запускает метод OnRun, и он сохраняет вывод двух команд "cvs" и "svn help" в файл cvs_test в домашнем каталоге пользователя. Когда я запускаю этот код с помощью интерпретатора python в командной строке, вывод обеих команд вписывается в текстовый файл. Обе команды cvs и svn распознаются, а вывод в файле cvs_test соответствует ожиданиям.
Теперь проблема заключается в том, когда я создаю приложение Mac с помощью py2app со следующим скриптом:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['cvs_test.py']
DATA_FILES = [('icons',['./icons/ark-2.png'])]
OPTIONS = {'iconfile': './icons/ark-2.icns'}
setup(app=APP,data_files=DATA_FILES,options={'py2app': OPTIONS},setup_requires=['py2app'])
Приложение Mac создано абсолютно нормально. Но когда я открываю приложение Mac и нажимаю кнопку "Запустить", в созданном cvs_test файле он говорит:
msgstr " sh: cvs: команда не найдена "
Mac-приложение, очевидно, работает с тем же скриптом, но не может найти команду cvs.
В моем домашнем каталоге следующее содержимое моего файла.profile:
export TERM="xterm"
export PATH='/Developer/usr/bin':$PATH
export PATH='/usr/local/bin':$PATH
Я добавил путь /Developer/usr/bin, выполнив трюк, размещенный на форумах Apple (нажмите здесь), чтобы решить проблему cvs на OS X Lion.
Что заставляет скрипт python идентифицировать cvs при запуске из командной строки и не идентифицировать его, когда тот же скрипт запускается как скомпилированное приложение Mac?
Этот вопрос убивает меня. Мой bash и sh оба они могут найти cvs при запуске с терминала, но приложение Mac не может. Любые предложения будут ценны.
Когда вы запускаете приложение OSX GUI из Finder/Dock, т.е. Не терминал, новая оболочка не запускается, поэтому ваш.profile не читается.
Вы можете установить переменные среды в ~/.MacOS/environment.plist согласно документу Apple
Вы также можете установить среду (например, добавить к пути) или явно использовать полные пути к cvs и svn в сценарии python
Попробуйте добавить следующее:
import os
print os.environ["PATH"]
к вашему приложению. Я подозреваю, что он не работает по тому же пути, что и при запуске вашего кода Python из командной строки.
Если окажется, что ваш путь не соответствует ожидаемому, вы можете добавить приложение app/usr/local/bin в os.enviorn ["PATH"]. Это может быть хорошим решением, если вам просто нужны эти инструменты для вашего приложения.