我在Windows上使用PowerShell和WSL‘Ubuntu20.04LTS’。我没有本地Linux分区,而且由于嵌套设备的原因,我不能使用虚拟化。
我的目的是使用PowerShell中的调用WSL将一些avd快照解密为原始图像。我已经试过了os.popen
,os.popen
,win32com.client
,multiprocessing
等等。
我可以引导WSL 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()
发布于 2022-02-24 14:19:56
有几种方法可以从Windows运行WSL脚本/命令,但是SendKeys
-based方法通常是最后的手段,因为它是:
non-deterministic
此外,避免使用ubuntu2004.exe
(或者,对于其他发现此命令的用户,避免使用不推荐的bash.exe
命令)。您要寻找的是更有能力的wsl.exe
命令。它有许多用于运行<distroname>.exe
版本缺少的命令的选项。
考虑到这一点,下面是几个简化的例子:
使用os.system
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)-c "<command(s)>"
来运行while 中的这些命令
因此,您几乎可以从Windows运行任何Linux命令。对于多个命令:
filelist.txt') (‘wsl~ -e sh -c "ls -l > filelist.txt;gzip -c)
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
import subprocess
cp = subprocess.run(["wsl", "~", "-e", "ls", "-l"], capture_output=True)
print(cp.stdout)
和前面一样,-e
参数可以是任意类型的Linux脚本。
注意,subprocess.run
还为您提供了命令的退出状态。
https://stackoverflow.com/questions/71239268
复制相似问题