You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python subprocess在WSL的fish shell中执行命令

问题根源
  • 你的第一段代码调用subprocess.run(["wsl", "fish"], shell=True)会启动fish的交互式会话,默认会阻塞等待用户手动输入指令,所以会出现停滞现象。
  • 第二段代码的subprocess.run(["date"], shell=True)是在Windows本地的shell环境执行命令,和之前启动的WSL fish会话完全无关,自然不会在fish中运行。
解决方法

方法1:单条/多条命令直接执行(最常用)

通过fish自带的-c参数传入要执行的命令,命令执行完成后fish会自动退出,不会阻塞。
示例代码:

import subprocess

# 执行单条date命令
result = subprocess.run(
    ["wsl", "fish", "-c", "date"],
    capture_output=True,
    text=True
)
# 打印命令输出
print("命令执行结果:", result.stdout)
# 打印错误信息(如果有)
if result.stderr:
    print("错误信息:", result.stderr)

# 执行多条命令的写法,用分号分隔即可
subprocess.run(
    ["wsl", "fish", "-c", "date; pwd; echo 'test command'"]
)

这个方案不需要shell=True参数,安全性更高,也能避免不必要的shell嵌套。

方法2:持久化交互式fish会话(适合需要多次执行命令的场景)

如果你需要在同一个fish会话中连续执行多条命令,避免每次启动WSL的开销,可以用subprocess.Popen绑定标准输入输出流,主动向fish进程写入命令:

import subprocess
from subprocess import PIPE

# 启动fish会话,绑定标准输入输出
fish_proc = subprocess.Popen(
    ["wsl", "fish"],
    stdin=PIPE,
    stdout=PIPE,
    stderr=PIPE,
    text=True
)

# 写入要执行的命令,注意末尾加\n模拟回车输入,最后加exit\n结束会话
commands = """
date
pwd
echo "second command"
exit
"""
stdout, stderr = fish_proc.communicate(input=commands)

print("执行结果:", stdout)
if stderr:
    print("错误:", stderr)
注意事项
  • 如果要传递包含空格、特殊符号的命令参数,建议按参数拆分传入,避免转义问题。
  • 涉及Windows路径传递到WSL环境时,可以先调用wsl path 你的Windows路径转换成WSL可识别的路径格式。

内容的提问来源于stack exchange,提问作者Kiran Deep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:24:04