[英]Protect against null environment variables when using os.path.expandvars
我如何防止 Python 的os.path.expandvars()
處理 null/unset 環境變量?
來自os.path :
格式錯誤的變量名稱和對不存在變量的引用保持不變。
>>> os.path.expandvars('$HOME/stuff')
'/home/dennis/stuff'
>>> os.path.expandvars('foo/$UNSET/bar')
'foo/$UNSET/bar'
我可以與其他路徑處理( expanduser()
、 realpath(),
normpath()
等)分開執行此步驟,而不是將它們全部鏈接在一起並檢查結果是否未更改,但在沒有更改時這是正常的存在變量 - 所以我還必須解析字符串以查看它是否有任何變量。 我擔心這可能不夠穩健。
使用結果創建文件時會出現此問題。 我最終得到一個文件,其中變量名作為文件名的文字部分。 我想拒絕異常輸入。
您可以使用string.Template
,它使用類似的美元符號語法對變量進行插值,但如果不存在某些內容而不是將其保留,則會引發KeyError
。
import os
from string import Template
print(Template('$HOME/stuff').substitute(os.environ))
擴展傑森的:
def expand_user_vars(s, variants='$%s ${%s} %%%s%%'):
'''Return a string expanded for both leading "~/" or "~username/" and
environment variables in the forms given by variants.
>>> s = "~roland/.local/%XYZ%$XYZ${XYZ}"
>>> expand_user_vars(s)
'/home/roland/.local/'
>>> s = "$HOME/.local/%XYZ%$XYZ${XYZ}"
>>> expand_user_vars(s)
'/home/roland/.local/'
>>> s = "$EDITOR"
>>> 'EDITOR' not in expand_user_vars(s)
True
'''
s = os.path.expanduser(s)
#python2 does not have KeyError in str(e)
remx = re.compile(r"(?:KeyError:)?\s*'(\w+)'")
while True:
try:
s = string.Template(s).substitute(os.environ)
break
except KeyError as e:
reme = str(e)
remxo = remx.match(reme)
if remxo:
g1 = remxo.group(1)
for v in variants.split():
s = s.replace(v%g1,'')
continue
return s
否則, echo
在 Linux 和 MacOS 以及 Windows 上存在。將下面的示例替換為...'echo '+s...
:
import subprocess
netrc_file = subprocess.check_output('echo ${NETRC:-~/.netrc}',shell=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.