我在Windows上使用PowerShell和WSL"Ubuntu20.04 LTS".我没有原生Linux发行版,由于嵌套设备的原因,我无法使用虚拟化.

我的目的是在PowerShell中使用Windows Python脚本调用WSL,将一些avd快照解密为原始图像.我已经试过os.popensubprocess.Popen/run/callwin32com.clientmultiprocessing等等.

我可以启动WSL shell,但不会向它传递更多命令.有人知道如何使shell 聚焦,并为更多指示做好准备吗?

代码示例:

from multiprocessing import Process
import win32com.client
import time, os, subprocess

def wsl_shell():
    shell = win32com.client.Dispatch("wscript.shell")
    shell.SendKeys("Start-Process -FilePath C:\\Programme\\WindowsApps\\CanonicalGroupLimited.Ubuntu20.04onWindows_2004.2021.825.0_x64__79rhkp1fndgsc\\ubuntu2004.exe {ENTER}")
    time.sleep(5)
    os.popen("ls -l")
    
if __name__ == '__main__':
    ps = Process(target = wsl_shell)
    ps.start()

推荐答案

从Windows Python运行WSL脚本/命令有几种方法,但基于SendKeys的方法通常是最后的 Select ,IMHO,因为它:

  • 通常是不确定的
  • 缺少任何控制逻辑

此外,避免ubuntu2004.exe.更强大的wsl.exe命令是你正在寻找的.它有lot个选项来运行<distroname>.exe个版本所缺少的命令.

考虑到这一点,这里有几个简单的例子:


Using os.system
import os
os.system('wsl ~ -e sh -c "ls -l > filelist.txt"')

在Windows Python中运行完这段代码后,进入你的Ubuntu WSL实例,你会在你的主目录中找到filelist.txt.

这是因为:

  • os.system可用于启动wsl命令
  • ~告诉WSL在用户的主目录中启动(更具确定性,同时能够避免在这种情况下指定每个路径)
  • wsl -e sh在WSL中运行POSIXshell (您也可以使用bash)
  • -c "<command(s)>"传递给shell将在WSL shell中运行这些命令

有鉴于此,您几乎可以从Windows Python运行任何Linux命令.对于多个命令:

  • 或者用分号分开.例如.:

    os.system('wsl ~ -e sh -c "ls -l > filelist.txt; gzip filelist.txt')
    
  • 或者更好,只需将它们全部放在WSL中的一个脚本中(带有shebang行),将其设置为可执行,然后通过以下方式运行脚本:

    wsl -e /path/to/script.sh
    

    这甚至可以通过Linux Python脚本实现(假设脚本中有正确的shebang行):

    wsl -e /path/to/script.py
    

    因此,如果需要,您甚至可以通过这种方式从Windows Python调用Linux Python.


Using subprocess.run

对于不需要用Python处理结果的"fire and forget"脚本来说,os.system语法非常好,但通常需要捕获WSL/Linux命令的输出,以便用Python进行处理.

为此,请使用subprocess.run:

import subprocess
cp = subprocess.run(["wsl", "~", "-e", "ls", "-l"], capture_output=True)
print(cp.stdout)

与前面一样,-e参数可以是任何类型的Linux脚本.

请注意,subprocess.run还提供命令的退出状态.

Python相关问答推荐

来自ARIMA结果的模型方程

如何处理必须存在于环境中但无法安装的Python项目依赖项?

按照行主要蛇扫描顺序对点列表进行排序

剧作家Python没有得到回应

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

Pytest两个具有无限循环和await命令的Deliverc函数

如何避免Chained when/then分配中的Mypy不兼容类型警告?

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何在polars(pythonapi)中解构嵌套 struct ?

数据抓取失败:寻求帮助

从groupby执行计算后创建新的子框架

如何将多进程池声明为变量并将其导入到另一个Python文件

部分视图的DataFrame

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

无法连接到Keycloat服务器

Tkinter菜单自发添加额外项目

* 动态地 * 修饰Python中的递归函数

Flash只从html表单中获取一个值

无法在Spyder上的Pandas中将本地CSV转换为数据帧