簡體   English   中英

xonsh “which” 等效 - 如何測試(子進程模式)命令是否可用?

[英]xonsh "which" equivalent - how to test if a (subprocess mode) command is available?

我想測試(來自 xonsh)命令是否可用。 如果我在 xonsh 命令提示符下嘗試此操作:

which bash

然后它起作用了:

user@server ~ $ which bash                                                                                                           
/usr/bin/bash

但它不適用於 xonsh 腳本:

#!/usr/bin/env xonsh
$RAISE_SUBPROC_ERROR = True
try:
    which bash
    print("bash is available")
except:
    print("bash is not available")

因為它會導致此錯誤:

NameError: name 'which' is not defined

我知道which是一個內置的 shell。 例如,它不是可執行文件。 但它在 xnosh 命令提示符下可用。 那為什么它在 xonsh 腳本中不可用? 最終的問題是:如果(子進程模式)命令可用,我如何測試(從 xonsh 腳本)?

import shutil
print(shutil.which('bash'))

雖然 nagylzs 的回答讓我找到了正確的解決方案,但我發現它還不夠。

shutil.which默認為os.environ['PATH'] 在我的機器上,默認的os.environ['PATH']不包含 xonsh 識別的活動路徑。

 ~ $ os.environ['PATH']
'/usr/bin:/bin:/usr/sbin:/sbin'

我發現我需要傳遞$PATH才能可靠地解析 xonsh 環境中的“which”。

 ~ $ $PATH[:2]
['/opt/google-cloud-sdk/bin', '/Users/jaraco/.local/bin']
 ~ $ import shutil
 ~ $ shutil.which('brew', path=os.pathsep.join($PATH))
'/opt/homebrew/bin/brew'

最新版本的xonsh包含一個內置的which命令。 不幸的是,如果未找到目標,包含的版本將在標准輸出上發出錯誤,這種行為不適合非交互式使用

正如另一個答案中提到的那樣, which存在於當前版本的 xonsh(0.13.4 截至 2022 年 12 月 15 日),因此您的腳本可以運行。 但是,它會輸出自己的錯誤消息,因此有必要重定向stderr以擺脫它。

此外,除非您也重定向其stdout (使用all> ),否則捕獲其輸出可能是個好主意,因此最終版本如下所示:

#!/usr/bin/env xonsh
$RAISE_SUBPROC_ERROR = True

try:
    bash = $(which bash err> /dev/null)
    print(f"bash is available: {bash}")
except:
    print("bash is not available")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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