假设您只想捕获输出,最有效的调用应该是:
cp = subprocess.run(["wsl", "-e", "date"], capture_output=True)
date = cp.stdout
通过指定-e,您完全跳过了shell,从而避免了shell 启动的开销。
如果你真的想强制它在fish 内运行:
cp = subprocess.run(["wsl", "-e", "fish", "-c", "date"], capture_output=True)
date = cp.stdout
更多细节:
如果fish 是您的默认shell,那么您真的不需要将它指定为wsl 命令的参数。您可以通过在 PowerShell 或 CMD 中尝试以下操作来看到这一点:
wsl ps -eH
PID TTY TIME CMD
1 ? 00:00:00 init
21 ? 00:00:00 init
22 ? 00:00:00 init
23 pts/0 00:00:00 fish
30 pts/0 00:00:00 ps
请注意,ps 命令虽然在 WSL 命令行上不带 fish 运行,但仍然在默认 shell 下运行。
但是,您没有必须。如果命令不需要 shell,您可以通过以下方式直接运行它而无需通过 shell(避免开销):
wsl -e ps -ef
PID TTY TIME CMD
1 ? 00:00:00 init
11 ? 00:00:00 init
12 ? 00:00:00 init
13 pts/0 00:00:00 ps
您会注意到没有任何 shell 正在运行。这是我在上面用 Python 中的 ["wsl","-e","date"] 推荐的变体。
假设 fish 不是您的默认 shell,但您确实希望它运行。
wsl -e fish -c "ps -eH"
PID TTY TIME CMD
1 ? 00:00:00 init
20 ? 00:00:00 init
21 ? 00:00:00 init
22 pts/0 00:00:00 fish
29 pts/0 00:00:00 ps
但不要使用wsl fish "ps -eH"(或wsl fish -c date)。那会鱼中之火,非常浪费:
PID TTY TIME CMD
1 ? 00:00:00 init
11 ? 00:00:00 init
12 ? 00:00:00 init
13 pts/0 00:00:00 fish
20 pts/0 00:00:00 fish
22 pts/0 00:00:00 ps