使用py2app创建的Python Mac应用程序找不到cvs命令

时间:2011-09-05 16:52:37

标签: python macos wxpython cvs py2app

开始之前的一些系统/软件信息:

操作系统:Mac OS X 10.7.1

Python:Active Python 2.7.2.5

wxPython:wxPython2.9-osx-2.9.1.1-cocoa-py2.7

我有一个基于wxpython的小型Mac应用程序,只测试Mac平台上cvs和svn的可用性。这是Mac应用程序所基于的python代码:

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()

以下是这个简单GUI的屏幕截图,其中一个按钮名为“Run”。

screen shot of the simple cvs test app with a single 'Run' button

按下'Run',它会执行OnRun方法,并将两个命令'cvs'和'svn help'的输出保存到用户主目录中名为'cvs_test'的文件中。当我在命令行上使用python解释器运行此代码时,两个命令的输出都会吐入文本文件中。 cvs和svn命令都被识别,文件cvs_test中的输出符合预期。

现在的问题是当我使用py2app使用以下脚本创建Mac应用程序时:

"""
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文件中,它说:

sh:cvs:command not found

Mac应用程序显然运行相同的脚本,但找不到cvs命令。

在我的主目录中,以下是我的.profile文件的内容:

export TERM="xterm"
export PATH='/Developer/usr/bin':$PATH
export PATH='/usr/local/bin':$PATH

我按照Apple论坛(click here)上发布的技巧添加了路径'/ Developer / usr / bin',以解决OS X Lion上的cvs问题。

是什么原因导致python脚本在从命令行运行时识别cvs,而在将相同的脚本作为已编译的Mac应用程序运行时不识别它?

这个问题正在扼杀我。我的bash和sh两个都可以从终端运行时找到cvs,但Mac应用程序不能。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

当您从Finder / Dock运行OSX GUI应用程序时,即不是终端时,未启动新shell,因此不会读取.profile。

您可以按照Apple doc

在〜/ .MacOS / environment.plist中设置环境变量

你也可以设置环境(例如添加到路径)或在python脚本中显式使用cvs和svn的完整路径

答案 1 :(得分:1)

尝试添加以下内容:

import os
print os.environ["PATH"]

到您的应用。我怀疑它没有运行与从命令行运行Python代码时相同的路径。

如果事实证明你的路径不符合预期,你可以让你的应用程序将/ usr / local / bin附加到os.enviorn [“PATH”]。如果您只需要为您的应用使用这些工具,这可能是一个很好的解决方案。