【问题标题】:Python subprocess.run('ls',shell=True) not working on windowsPython subprocess.run('ls',shell=True) 在 Windows 上不起作用
【发布时间】:2020-07-20 06:36:33
【问题描述】:
import subprocess

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

输出:

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

【问题讨论】:

  • ls 不是 Windows 上的命令。如果你想在 windows 上使用 linux 命令,请使用 WSL 或 Cygwin。
  • 您希望ls 在 Windows 上做什么?它目前的行为与您在cmd.exe 中键入它的行为相同?您是否尝试运行 Powershell 别名?还是 Unix 命令?
  • 出于可移植性和效率的原因,当有提供相同功能的 Python 标准模块时,您应该避免运行外部命令。在这种情况下,您可以致电os.scandir 获取目录列表和文件信息。

标签: python windows subprocess


【解决方案1】:

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

import subprocess

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

(显然你需要确保文件名是正确的;我在这里疯狂猜测)。

顺便说一句,you should generally avoid ls in scripts. Python 具有很好的工具,可以通过pathlib 模块获取有关文件大小、所有权等信息,或者如果您需要支持真正旧版本的 Python,请查看os 模块(当然还有glob.glob() 用于通配符扩展,虽然ls is useless for that 也是)。

在 Linux(或一般类 Unix 平台)上,如果您想使用特定于 Bash 的 shell 语法(如数组、进程替换、大括号扩展、此处为字符串、etc etc etc),这也是必要的。对于系统安装的版本,Bash 的位置通常是 /bin/bash,尽管在 /usr/bin/bash/usr/local/bin/bash 之类的地方或 /opt 的某个地方对于自定义安装的版本并不罕见。

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

对于仅运行单个可执行文件,您通常使用want to avoid shell=True,但如果它不在您的PATH 上,您需要指定可执行文件的完整路径。

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

(显然在 Windows 上使用 Git Bash,安装 ls.exe 的实际目录会更长,更令人讨厌)。

【讨论】:

【解决方案2】:

ls 不是 Windows 命令。它适用于 Unix。它在 Windows 上的对应物是dir。 试试看:

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

如果出于某种神秘的原因,您必须致电 ls,有很多方法可以这样做。

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

subprocess.call(r'c:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe ls', shell=True)

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

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

最后,列出目录的最通用方法是使用内置的 Python 功能。例如,以下将为您提供当前目录的内容:

import os
os.listdir('.')

【讨论】:

  • 感谢大家的快速回复。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2020-03-29
  • 2021-05-27
  • 1970-01-01
  • 2020-02-16
  • 2013-05-02
  • 2015-04-21
  • 1970-01-01
相关资源
最近更新 更多