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

1 投票
2 回答
977 浏览
提问于 2025-04-17 01:30

在开始之前,先介绍一下系统和软件的信息:

操作系统: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()

下面是这个简单图形界面的截图,界面上有一个叫“运行”的按钮。

简单的cvs测试应用程序的截图,只有一个'运行'按钮

当我按下“运行”按钮时,它会执行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论坛上看到的一个技巧添加了路径'/Developer/usr/bin',以解决OS X Lion上的cvs问题。

为什么Python脚本在命令行中运行时能识别cvs,而当同样的脚本作为编译后的Mac应用程序运行时却不能识别呢?

这个问题让我很困扰。我的bash和sh在终端中都能找到cvs,但Mac应用程序却找不到。任何建议都将非常感激。

2 个回答

1

试着在你的应用里加上以下内容:

import os
print os.environ["PATH"]

我怀疑你的应用运行时的路径和你在命令行里运行Python代码时的路径不一样。

如果发现你的路径和你想的不一样,你可以让你的应用在os.environ["PATH"]后面加上/usr/local/bin。这对于你只需要这些工具在你的应用里是个不错的解决办法。

2

当你从Finder或Dock启动一个OSX的图形界面应用时,也就是不通过终端启动,这时候不会新开一个命令行窗口,所以你的.profile文件不会被读取。

你可以在~/.MacOS/environment.plist文件中设置环境变量,具体可以参考苹果的文档

你也可以在Python脚本中设置环境变量(比如添加到路径中),或者直接使用cvs和svn的完整路径。

撰写回答