如何让Python的os.system()在Windows上改用Ubuntu终端而非cmd?
实现方案
前提:你已经在Windows上安装了**WSL(Windows Subsystem for Linux)**并配置好了Ubuntu发行版。
方案1:直接通过WSL执行Linux命令
不用修改os.system的底层调用逻辑,只需在要执行的命令前添加wsl前缀,让Windows通过WSL转发命令到Ubuntu环境执行。示例:
import os # 执行Ubuntu的ls命令 os.system('wsl ls -l /home') # 执行Ubuntu本地的bash脚本 os.system('wsl bash /mnt/c/Users/YourName/scripts/test.sh')
这里os.system仍调用cmd,但cmd会通过wsl指令将命令传递给Ubuntu环境处理。
方案2:封装自定义函数替代os.system
如果不想每次都手动加wsl前缀,可以封装一个自定义函数,统一处理命令转发:
import os def ubuntu_system(cmd): return os.system(f'wsl {cmd}') # 使用示例 ubuntu_system('echo "Hello from Ubuntu terminal!"') ubuntu_system('sudo apt update')
如果要执行复杂命令(含引号、管道符等),更推荐用subprocess模块,避免转义问题:
import subprocess def ubuntu_run(cmd): # capture_output=True 可捕获命令输出,text=True 将输出转为字符串 result = subprocess.run(f'wsl {cmd}', shell=True, capture_output=True, text=True) return result # 示例:获取命令执行结果 output = ubuntu_run('ls -l /home').stdout print(output)
方案3:弹出Ubuntu终端窗口执行命令
如果希望直接弹出Ubuntu终端窗口执行命令(而非在Python脚本控制台输出),可以调用WSL的Ubuntu启动程序:
import os # 打开Ubuntu终端并执行命令,执行完后等待用户输入再关闭窗口 os.system('ubuntu.exe run "ls -l && read -p \'Press enter to exit...\'"')
若你的Ubuntu发行版名称不是默认的Ubuntu,可以用wsl -d <发行版名称>指定,比如:
os.system('wsl -d Ubuntu-22.04 run "echo Test && read"')
注意事项
- Windows本地路径在Ubuntu中需转换为WSL格式:比如
C:\Users\YourName对应/mnt/c/Users/YourName - 执行
sudo类权限命令时,非交互式脚本需配置免密sudo(不建议明文传递密码,存在安全风险) - 若未设置默认WSL发行版,需在命令中通过
-d参数明确指定发行版名称
内容的提问来源于stack exchange,提问作者Guan Li
相关产品推荐
相关产品推荐

