Mac OS X:从 Python 脚本中更改 $PATH

Mac OS X:从 Python 脚本中更改 $PATH

我有一堆 python 脚本。其中一个安装软件(subversion),需要将其路径添加到 $PATH。安装后,我希望下一个脚本使用该软件。如果我export PATH=/opt/subversion/bin:$PATH在第一个和第二个脚本之间在 bash 中运行,一切正常。但如果我将其添加os.system( 'export PATH=/opt/subversion/bin:$PATH' )为第一个脚本(安装 subversion)的最后一个命令,则$PATH退出后保持不变。

有没有办法从 python 脚本内部更改 $PATH,以便它在脚本完成后仍保持更改(当然,在单个 bash 会话内,我知道/etc/profile)。

答案1

os.system()生成一个子 shell。因此它不知道您现有的 shell。

当然,您可以在运行命令时设置路径(无需导出)。即:

PATH="$PATH:/opt/subversion/bin" /command/to/run

哦,os.system() 正在被弃用。你应该切换到subprocess.Popen()

答案2

一般来说这是不可能的。一个进程不能改变另一个进程的环境。

父进程可以预设它所衍生的子进程的环境,但实际上一个进程无法影响另一个进程的环境,除非这些应用程序专门设计为允许这样做。

答案3

正如其他人指出的那样,实际上没有任何方法可以修改父进程的环境。这需要在父进程的内存中乱动,据我所知,没有明确定义的方法可以做到这一点(也就是说,您可能会使 shell 崩溃)。

如果您随后运行的脚本/程序是 python,那么您可以作为在这些程序中做的第一件事,将 subversion 的路径添加到它们的环境中。

import os
os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']

或者,如果您总是以相同的顺序和相同的参数运行相同的脚本,请将它们包装在 shell 脚本中,该脚本会为其自身设置环境并运行这些程序/脚本。

还有另一种解决方法,作为安装 subversion 脚本中最后要做的一件事,您可以用另一个具有所需环境的 shell 替换该进程。您将在 bash 中运行 bash,但好吧,这可能是一种不错的解决方法。

#! /usr/bin/env python

# do stuff
# install subversion
# do more stuff

# at the point you exit
if everything_went_well:
  import os
  os.putenv('PATH', '/opt/subversion/bin:' + os.environ['PATH'])
  os.execv('/bin/bash', [])

相关内容