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