为什么不能从Python调用SSH终端命令?

时间:2019-12-29 23:08:30

标签: python shell ssh command-line subprocess

我正在尝试通过SSH将文件复制到Raspberry pi,并且我想从python执行Windows终端命令,因此以后可以将其自动化。但是,每次尝试执行它都会收到错误。当我手动将SSH命令放入控制台时,它会按预期工作,但从此脚本中调用它时,它将无法工作。我以前从未在python中调用过控制台命令,因此我正在尝试使用发现的其他一些线程。我可能做错了什么?我也尝试过运行os.system,它没有返回错误,但是也没有按原样执行命令。我正在使用Python 3.8.1。这是我的脚本,也是错误,感谢您的帮助。

代码:

import subprocess

subprocess.run(['scp <text file path> pi@<IP>:here/'])
print ("done")

错误

Traceback (most recent call last):
  File "<script file path>.py", line 3, in <module>
    subprocess.run(['scp <text file path>.txt pi@<IP>:here/'])
  File "<python file path>\Python38-32\lib\subprocess.py", line 489, in run
    with Popen(*popenargs, **kwargs) as process:
  File <python file path>\Python38-32\lib\subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File <python file path>\Python38-32\lib\subprocess.py", line 1307, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified

编辑:这是当我分割一系列命令时遇到的错误:

代码:

import subprocess

subprocess.run(['scp', '<text file path>.txt', 'pi@<IP>:here/'])
print ("done")

错误:

Traceback (most recent call last):
  File "<script file path>.py", line 3, in <module>
    subprocess.run(['scp', '<text file path>.txt', 'pi@<IP>:here/'])
  File "<python file path>\Python38-32\lib\subprocess.py", line 489, in run
    with Popen(*popenargs, **kwargs) as process:
  File "<python file path>\Python38-32\lib\subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File <Python file path>\Python38-32\lib\subprocess.py", line 1307, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified

当然,我放入<>的所有内容都是为了保护我的信息。

2 个答案:

答案 0 :(得分:0)

要么删除列表,然后让Shell解析字符串

import subprocess

subprocess.run('scp <text file path> pi@<IP>:here/', shell=True)
print ("done")

或将命令自己拆分为各个组成部分

import subprocess

subprocess.run(['scp', <text file path>, 'pi@<IP>:here/'])
print ("done")

对于您的错误,<text file path>是相对错误的相对路径(鉴于当前工作目录),或者scp不在您的PATH中。从错误消息中还不清楚找不到哪个文件。

答案 1 :(得分:0)

对于任何回到这篇文章的人来说,解决方案是使用不同的方法来运行脚本。我正在使用似乎不喜欢它的默认 python IDLE。尝试在您计算机的控制台中运行该脚本。