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。

您當然可以在運行命令時設定路徑(不匯出)。 IE:

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

哦,os.system() 正在貶值。你應該切換到subprocess.Popen()

答案2

一般來說,這是不可能的。一個進程不能改變另一進程的環境。

父進程可以預設其產生的子進程的環境,但一個進程實際上沒有任何方法可以影響另一個進程的環境,除非這些應用程式經過專門設計以允許這樣做。

答案3

正如其他人指出的那樣,實際上沒有任何方法可以修改父進程的環境。它需要在父進程的記憶體中擺弄,據我所知,沒有明確定義的方法來做到這一點(即你可能會破壞你的外殼)。

如果您隨後執行的腳本/程式是 python,您可以在這些程式中做的第一件事是在其環境中新增顛覆路徑。

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', [])

相關內容