【问题标题】:cvs command not found by a Python Mac app created using py2app使用 py2app 创建的 Python Mac 应用找不到 cvs 命令
【发布时间】:2011-09-05 16:52:36
【问题描述】:

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

操作系统: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 平台上的可用性。这是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”时,它会执行 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: 找不到命令"

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 应用程序不能。任何建议将不胜感激。

【问题讨论】:

    标签: python macos wxpython cvs py2app


    【解决方案1】:

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

    您可以按照Apple doc在~/.MacOS/environment.plist 中设置环境变量

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

    【讨论】:

    • 但是,注销并重新登录将允许获取 .profile 中的新设置..
    • @马克。这是正确的。 OSX GUI 应用程序不读取 .profile。我使用属性列表编辑器编辑了 ~/.MacOS/environment.plist 文件并重新启动了 Mac(需要重新启动)。如果不重新启动,如果我尝试使用 GUI 应用程序,它就无法识别。但是,现在重新启动后,当我运行 GUI 应用程序时,它会识别 cvs 并将预期的输出打印到 cvs_test 文件。非常感谢您的帮助:)
    【解决方案2】:

    尝试添加以下内容:

    import os
    print os.environ["PATH"]
    

    到您的应用程序。我怀疑它的运行路径与从命令行运行 Python 代码时的路径不同。

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

    【讨论】:

    • 你是对的。脚本打印的路径为:/usr/local/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/ bin:/usr/local/mysql/bin:/opt/local/bin:/usr/local/git/bin。但是Mac应用打印的路径是:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/本地/git/bin。所以很明显它没有使用'/Developer/usr/bin'路径。我应该怎么做才能使用正确的路径?
    • 我添加了几行,但看起来您已经找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2015-12-21
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多