1

我正在编写一个要在笔记本电脑浏览器上运行的 Python CGI 脚本。该脚本将通过 SSH 连接到两个 Pi,并发出拍照命令。托管此脚本的服务器位于我要通过 SSH 连接的其中一个 Pi 上,并且该 Pi 还充当另一个 Pi 和我的笔记本电脑连接的接入点(一切都是 LAN,未连接到 Internet) .

我能够在笔记本电脑的浏览器上成功运行此脚本,以ls -l在两个 Pis 上运行简单的命令,并在浏览器上打印出两者的结果。但是,我最终希望能够raspistill向两个 Pi 发出命令。当我这样做时,只有带有服务器的 Pi 正在拍摄图像,而另一个 Pi 没有。我认为这是因为没有为服务器正确设置权限(我尝试运行命令,sudo但仍然没有运气)。但是,如果我在 Python IDLE 上运行相同的脚本,它就可以正常工作。有人可以帮我确定问题吗?

这是我的脚本:

#! /usr/bin/env python3

from pssh import ParallelSSHClient
import cgi

print("Content-Type: text/plain\r\n")
print("\r\n ")

host = ['172.24.1.1','172.24.1.112']
user = 'XXXX'
password = 'XXXX'
client = ParallelSSHClient(host, user, password)

output = client.run_command('raspistill -o test.jpg', sudo=True)

// AMENDMENT:
for line in output['172.24.1.1'].stdout:  // works as well with '172.24.1.112'
    print(line)

修正:显然,如果我从中输出任何东西,stdout它就可以正常工作。为什么会这样?是只是在等我刷新输出还是什么?我怀疑这可能是我正在使用的 pssh 包的问题。

4

2 回答 2

1

在彻底阅读了该pssh模块的文档后,我的问题与退出代码及其处理方式有关。

关于的文档run_command指出:

函数将在连接和身份验证建立后以及向成功建立的 SSH 通道发送命令后返回。

结果:

因此,即使对于立即退出的命令,退出代码也不会立即可用。

最初,我只是盲目地运行run_command期望命令完成,但事实证明我需要获取退出代码才能真正完成命令正在运行的进程。文档说明了几种方法来做到这一点:

至少其中之一

  • 迭代 stdout/stderr 以完成
  • 调用对于等待命令完成并能够收集退出代码client.join(output)是必要的。parallel-ssh

这就是为什么在我对从标准输出输出的代码的修改中,这些命令似乎可以正常工作。

于 2017-08-04T03:02:21.267 回答
1

在您的 pi 中,进入终端并键入sudo raspi-config,然后使用键导航到相机,然后启用它。这将重新启动您的 pi。来自https://www.raspberrypi.org/documentation/configuration/camera.md

使用光标键移动到相机选项,然后选择“启用”。在退出 raspi-config 时,它会要求重新启动。启用选项将确保在重新启动时,正确的 GPU 固件将与相机驱动程序和调整一起运行,并且 GPU 内存分配足以让相机获得足够的内存以正确运行。

在此之后,进入sudo raspi-config并启用 ssh(这是另一个选项,就像 pi-camera 一样)。链接在这里

于 2017-08-04T01:52:38.937 回答