如何在Windows的Python脚本中调用WSL Ubuntu 20.04环境的命令?
核心问题梳理
你需要在Windows Python脚本中调用WSL Ubuntu 20.04的Cshell脚本,但当前尝试要么执行失败,要么生成空日志,同时需要在Spyder中实时查看Shell输出。以下是具体排查和解决步骤:
1. 脚本执行器不匹配(空日志直接原因)
你的辅助脚本subsidence_script_1.sh的shebang是#!/bin/csh(指定用Cshell解析),但调用时却用dash subsidence_script_1.sh——dash是Bourne Shell变种,无法正确解析Cshell语法,直接导致脚本执行失败,所以生成空日志。
修正方式:直接用Cshell运行脚本,Python调用代码改为:
import os os.system('wsl -e csh /mnt/d/路径/subsidence_script_1.sh')
注意替换为脚本在WSL中的绝对路径(比如脚本放在Windows D盘根目录,对应WSL路径是/mnt/d/subsidence_script_1.sh)。
2. 路径错误修正
第一次尝试中的cd ../../mnt/d/...完全错误,WSL中Windows磁盘的挂载路径是/mnt/盘符/,直接用绝对路径/mnt/d/Projecten/Bodemdaling/Working_directories/Hawaii/asc/data即可,无需上级目录前缀。
3. 后台执行导致的进程终止问题
原命令末尾的&会把脚本放到后台执行,但WSL会话可能在Python调用结束后直接终止后台进程,导致脚本未完成就被杀死,日志为空。先去掉&,让脚本前台执行,确认功能正常后再考虑后台执行(若需后台,需保证WSL会话不被强制终止)。
修改后的辅助脚本:
#!/bin/csh cd /mnt/d/Projecten/Bodemdaling/Working_directories/Hawaii/asc/data organize_files_tops_linux.csh SAFE_filelist ../reframed/pins.ll 1 &> oft_mode1.log
4. Spyder中实时打印Shell输出
os.system无法实时捕获输出,改用subprocess模块实现实时打印:
import subprocess # 直接执行命令(无需辅助脚本的写法) command = '''wsl -e csh -c 'cd /mnt/d/Projecten/Bodemdaling/Working_directories/Hawaii/asc/data; organize_files_tops_linux.csh SAFE_filelist ../reframed/pins.ll 1' ''' # 启动子进程并捕获输出 proc = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 逐行实时打印输出 for line in proc.stdout: print(line, end='') # 等待进程结束并获取返回码 proc.wait() print(f"\n命令执行完成,返回码: {proc.returncode}")
如果想用辅助脚本,把command替换为'wsl -e csh /mnt/d/路径/subsidence_script_1.sh'即可。
额外排查点
- 给Cshell脚本添加可执行权限:在WSL终端运行
chmod +x /mnt/d/.../organize_files_tops_linux.csh - 手动在WSL中执行一遍目标命令,确认
SAFE_filelist、../reframed/pins.ll路径正确,排除脚本本身的逻辑问题。
内容的提问来源于stack exchange,提问作者TijnN

