2

我有以下问题。我想使用 matplotlib 包动画来保存一个 mp4 视频文件。save 函数依赖于生成 mp4 文件,即 ffmpeg 外部库。所以我通过 Macports 在 Mac osx 10.8 上安装了 ffmpeg,它安装在/opt/local/bin.

但是现在,在 canopy 中运行脚本,解释器(ipython shell)看不到 ffmpeg。我添加了 .bash_profile 的路径,我可以在终端上运行该程序,但是当我输入os.environ['PATH']实际PATH的 shell 时,并没有添加,/opt/local/bin也不存在。如果我尝试运行脚本,我会收到以下错误:

/Users/alejandrodelacallenegro/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-      packages/matplotlib/animation.py:695: UserWarning: MovieWriter ffmpeg unavailable
warnings.warn("MovieWriter %s unavailable" % writer)

有什么想法可以解决这个问题吗?我必须做些什么来更改 python 在启动时看到的环境变量?有没有人有同样的问题?
谢谢。

4

1 回答 1

7

这里的问题与Enthought无关;当您从 Finder、LaunchDaemons 等启动东西时,OS X 不会运行 bash,因此不会访问您的.bash_profile. 相反,它从launchd.

如果你想添加一些环境变量来影响launchd当前用户运行的任何东西,这很容易:

launchctl setenv PATH $PATH:/opt/local/bin

如果您希望每次登录时都发生这种情况,如果您创建一个文件~/.launchd.conf,则该文件中的子命令将在launchctl每次launchd启动时运行(这是登录新用户会话的第一步)。

如果您希望它是系统范围的,而不仅仅是您的用户,您可以sudolaunchctl 和/或 create/edit /etc/launchd.conf。但是,您几乎肯定不想更改root服务等使用的环境,除非您真的知道自己在做什么。

如果有帮助:launchctl手动使用, editing~/.launchd.conf和 editing/etc/launchd.conf大致相当于export, ~/.bash_profile, and /etc/profile(当然除了它们影响launchd而不是bash/ sh)。

有关详细信息,请参阅launchctl(1)手册页,或者只需键入launchctl以启动交互式会话并使用内置帮助。(这些页面launchd(8)launchd.conf(5)有有用的信息。)

您还可以使用已弃用的environment.plist文件来影响甚至不是由 运行的东西launchd,但是……这已被弃用,除了(很多)旧版本的 OS X 之外,它确实没有任何影响您关心的东西。


来自其他 Unix 系统的人经常被这个问题所吸引。大多数文件管理器要求 shell 为它们运行程序。Finder.app(以及命令行工具open、AppleScript 环境等)要求launchd执行此操作。另外,在大多数 X11 系统上,如果您从文件管理器中查找进程树,它最终也是由用户 shell 启动的,而在 OS X 上,Finder.applaunchd由系统范围启动launchd;看不到贝壳。

这也意味着其他特定于 shell 的内容,如更改资源限制或默认 umask 不会影响在 Mac 上的 shell 之外启动的程序。launchctl又是答案。

于 2013-09-18T22:25:30.257 回答