【发布时间】: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.
我已经尝试过其他命令,例如 echo 和 cd,这些都可以正常工作。我也可以在手动将命令输入到 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 specified。OpenSSH文件夹似乎通过子进程对 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']中列出。echo和cd内置在 shell 中,因此它们始终可用于shell=True。 (请注意,完全使用shell=True通常是一个非常糟糕的主意......但在 Windows 上并不像在其他任何地方那样正确)。 -
C:/Windows/System32/和C:/Windows/System32/OpenSSH/都在路径上。
标签: python windows path subprocess