我有一堆python脚本。 其中一个安装软件(颠覆),要求它的path被添加到$ PATH。 安装完成后,我想让下一个脚本使用该软件。 如果我在第一个脚本和第二个脚本之间运行export PATH=/opt/subversion/bin:$PATH ,一切正常。 但是,如果我添加os.system( 'export PATH=/opt/subversion/bin:$PATH' )作为第一个脚本(安装subversion)的最后一个命令, $PATH在退出后保持不变。
是否有任何方法可以从python脚本中更改$ PATH,所以脚本完成后(当然,我知道关于/etc/profile )在脚本结束后会保持更改。
os.system()生成一个子shell。 所以它不知道你现有的shell。
运行命令时,您当然可以设置path(不导出)。 即:
PATH="$PATH:/opt/subversion/bin" /command/to/run
哦,和os.system()正在折旧。 你应该切换到subprocess.Popen() 。
一般来说,这是不可能的。 一个进程不能改变另一个进程的环境。
父母可以预设它所产生的subprocess的环境,但是除非这些应用程序是专门devise来允许这样做,否则一个进程实际上没有办法影响另一个进程的环境。
正如其他人所指出的,没有任何方法可以修改父进程的环境。 它需要在父进程内存中进行摆弄,据我所知,没有明确的方法来做这件事(即你可能会崩溃你的shell)。
如果你以后运行的脚本/程序是python,那么你可以在这些程序中做第一件事,就是把它们颠覆到它们的环境中。
import os os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']
或者,如果您始终使用相同的参数以相同的顺序运行相同的脚本,请将它们包装在为其自身设置环境并运行这些程序/脚本的shell脚本中。
还有另外一种解决方法,就像你在安装Subversion的脚本中做的最后一件事情,你可以用另一个有你想要的环境的shellreplace这个进程。 你会在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', [])