首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Windows Python脚本向WSL Shell传递命令

从Windows Python脚本向WSL Shell传递命令
EN

Stack Overflow用户
提问于 2022-02-23 14:59:06
回答 1查看 1.5K关注 0票数 2

我在Windows上使用PowerShell和WSL‘Ubuntu20.04LTS’。我没有本地Linux分区,而且由于嵌套设备的原因,我不能使用虚拟化。

我的目的是使用PowerShell中的调用WSL将一些avd快照解密为原始图像。我已经试过了os.popenos.popenwin32com.clientmultiprocessing等等。

我可以引导WSL shell,但是没有更多的命令被传递给它。有人知道如何使外壳聚焦并为更多的指令做好准备吗?

代码示例:

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 14:19:56

有几种方法可以从Windows运行WSL脚本/命令,但是SendKeys-based方法通常是最后的手段,因为它是:

non-deterministic

  • Lacks
  • 经常使用任何控制逻辑

此外,避免使用ubuntu2004.exe (或者,对于其他发现此命令的用户,避免使用不推荐的bash.exe命令)。您要寻找的是更有能力的wsl.exe命令。它有许多用于运行<distroname>.exe版本缺少的命令的选项。

考虑到这一点,下面是几个简化的例子:

使用os.system

代码语言:javascript
运行
复制
import os
os.system('wsl ~ -e sh -c "ls -l > filelist.txt"')

在Windows中运行此代码之后,进入您的Ubuntu实例,您将在您的主目录中找到filelist.txt

这样做是因为:

  • os.system可用于启动wsl命令
  • ~告诉WSL从用户的主目录中启动(更确定,同时能够避免在WSL中指定POSIX )在WSL中运行POSIX(您还可以使用this)
  • Passing -c "<command(s)>"来运行while

中的这些命令

因此,您几乎可以从Windows运行任何Linux命令。对于多个命令:

  • 要么用分号分隔它们。例如:

filelist.txt') (‘wsl~ -e sh -c "ls -l > filelist.txt;gzip -c)

  • 或更高版本,只需将它们全部放在WSL中的脚本中(带有shebang行),将其设置为可执行文件,然后通过以下方式运行脚本:

wsl -e /path/to/script.sh

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

wsl -e /path/to/script.py

因此,如果需要,您甚至可以这样从Windows调用Linux。

使用subprocess.run

os.system语法非常适合于“触发和忘记”脚本,在那里您不需要处理Python中的结果,但通常需要捕获WSL/Linux命令的输出,以便在Python中进行处理。

为此,请使用subprocess.run

代码语言:javascript
运行
复制
import subprocess
cp = subprocess.run(["wsl", "~", "-e", "ls", "-l"], capture_output=True)
print(cp.stdout)

和前面一样,-e参数可以是任意类型的Linux脚本。

注意,subprocess.run还为您提供了命令的退出状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71239268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档