簡體   English   中英

使用 os.path.expandvars 時防止 null 環境變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM