【问题标题】:Python subprocess can't call "ssh"Python 子进程不能调用“ssh”
【发布时间】:2021-05-01 20:23:50
【问题描述】:

我正在使用 subprocess 模块从 Python 发送 shell 命令,特别是 ssh。下面是一个准系统示例:

import subprocess

sp = subprocess.run(["ssh"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f"stdout: {sp.stdout.decode()} \n\nstderr: {sp.stderr.decode()}")

这应该会从 stdout 返回 ssh 命令帮助,而不会从 stderr 返回任何内容。但是,我得到:

stdout:  

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

我已经尝试过其他命令,例如 echocd,这些都可以正常工作。我也可以在手动将命令输入到 shell 时使用ssh,但是当我尝试通过子进程执行它时它会失败。 C:\Windows\System32\OpenSSH 目录确实存在于我的计算机上(它包含 ssh.exe),但由于某些奇怪的原因,我无法使用子进程 cd 到它。

如果重要的话,子进程正在使用命令提示符cmd.exe,因为它似乎是默认值。

感谢任何帮助。谢谢!

-- 使用来自 cmets 的测试进行编辑--

  • 使用绝对路径C:/Windows/System32/OpenSSH/ssh.exe 不起作用,并通过stderr 给出The system cannot find the path specifiedOpenSSH 文件夹似乎通过子进程对 Python 不可见
  • os.environ[PATH] 包含 C:/Windows/System32/C:/Windows/System32/OpenSSH/
  • 使用shell=False(使用绝对路径或仅使用ssh)运行它会在Python 中引发错误:FileNotFoundError: [WinError 2] The system cannot find the file specified

【问题讨论】:

  • 使用绝对路径是否有效? C:/Windows/System32/OpenSSH/ssh.exe
  • ssh 已安装,我可以从命令提示符成功使用它,而不是通过子进程从 Python 中使用它。绝对路径没有帮助; “该系统找不到指定的路径”。无论出于何种原因,子进程都看不到 OpenSSH 文件夹。
  • 首先要确定您的 OpenSSH 二进制文件所在的目录是否在 os.environ['PATH'] 中列出。 echocd 内置在 shell 中,因此它们始终可用于 shell=True。 (请注意,完全使用shell=True 通常是一个非常糟糕的主意......但在 Windows 上并不像在其他任何地方那样正确)。
  • C:/Windows/System32/C:/Windows/System32/OpenSSH/ 都在路径上。

标签: python windows path subprocess


【解决方案1】:

你说C:\Windows\System32\OpenSSH\ssh.exe 存在,但是从 Python 运行时找不到它。这可能是因为安装了 32 位版本的 Python,而不是 64 位版本。

如果路径存在于其他地方,但不存在于 Python,这往往会牵连the file system redirector。当您告诉 Python 查看 C:\Windows\System32 时,它可能会看到 C:\Windows\SysWOW64。我建议卸载你拥有的任何 Python,并明确安装 64 位版本,这样它就不会受到重定向器的影响,并且会看到“真实的”System32

【讨论】:

  • 哇,谢谢,就是这样。我不知道有这样的重定向器。
  • 哇+1。好东西!你们 Windows 程序员必须生活在一个比我们其他人更陌生、更复杂的世界中。
  • @EvanRittner:是的,Windows 不做胖 DLL(一个 DLL 被编译为 32 位或 64 位,而不是同时编译),所以许多 32 位程序假设他们会找到他们的System32(原始名称)中的 DLL,而许多 64 位程序是为 32 位编写的,只是针对 64 位重新编译,并且 DLL 都具有相同的名称。所以微软想出了这个组合,让 32 位和 64 位程序都认为System32 是他们可以找到他们的 DLL 的地方,并且它无缝地重定向到引擎盖下的“真实”位置。以牺牲等级疯狂为代价获得了出色的后退/前锋兼容性。 :-)
  • 我在 python 64 和 windows 64 位,我得到同样的错误,它在 PATH 和所有
  • @FlyingThunder:PyCharm 历来默认为 32 位解释器 IIRC。你有多确定它真的是同一个解释器,它是真的 64位?
猜你喜欢
  • 2018-03-09
  • 2016-06-14
  • 1970-01-01
  • 2014-10-14
  • 2011-11-26
  • 2020-05-16
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多