Python subprocess.run('ls',shell=True) 在 Windows 上不起作用


import subprocess
subprocess.call('ls', shell=True)

输出:

'ls' is not recognized as an internal or external command, operable program or batch file.

ls不是Windows命令。它适用于Unixes。它在Windows上的对应程序是dir。试用:

import subprocess
subprocess.call('dir', shell=True)

如果出于某种神秘的原因,你必须调用ls,那么有很多方法可以做到这一点

首先,Windows PowerShell支持调用ls,你只需要告诉Python执行它(下面的路径在我的系统上有效(:

subprocess.call(r'c:WindowsSystem32WindowsPowerShellv1.0PowerShell.exe ls', shell=True)

或者,Windows 10现在支持Windows和Linux之间的互操作层,这允许在Windows上使用Linux的环境(称为Windows Linux子系统(。如果您已经安装了它,使用它的方法之一是在Linux命令前面加上wsl:

subprocess.call('wsl ls', shell=True)

最后,列出目录的最通用方法是使用内置的Python功能。例如,下面会给你当前目录的内容:

import os
os.listdir('.')

如果您的目标是在Windows上运行(Git(Bash作为subprocess.run()和朋友的外壳,则需要传入executable=关键字参数以指向其位置。

import subprocess
listing = subprocess.check_output(
'ls', shell=True, executable='c:/Program Files (x86)/Git/bin/bash.exe')

(显然,您需要确保文件名是正确的;我在这里猜测得很离谱(。

顺便说一句,您通常应该在脚本中避免使用ls。Python有很好的功能,可以通过pathlib模块获取有关文件大小、所有权等的信息,或者如果您需要支持真正旧版本的Python,可以查看os模块(当然还有glob.glob()用于通配符扩展,尽管ls对此也没用(。

在Linux(或通常类似Unix的平台(上,如果你想使用Bash特定的shell语法,如数组、进程替换、大括号扩展、here字符串等,这也是必要的。对于系统安装的版本,Bash的位置通常是/bin/bash,尽管在/usr/bin/bash中使用它并不罕见,或类似于CCD_ 15的某个地方或CCD_。

p = subprocess.run(
# Need bash for '{...}' and '<<<'
'cat /tmp/{one,two} - <<<"three"',
shell=True, executable='/bin/bash',
capture_output=True, check=True)

对于仅运行单个可执行文件,您通常希望避免使用shell=True,尽管如果可执行文件不在PATH上,则需要指定可执行文件的完整路径。

subprocess.call(['/bin/ls'])

(很明显,在Windows上使用Git Bash时,安装ls.exe的实际目录会更长,更废弃(。

相关内容

最新更新