我有一堆 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', [])