我正在编写一个Python CGI脚本,我想在笔记本电脑的浏览器上运行。这个脚本将SSH成两个Pis,并给出命令拍照。托管此脚本的服务器位于我要通过SSH连接的其中一个Pis上,并且Pi还充当其他Pi和我的笔记本电脑连接的接入点(一切都是LAN,未连接到Internet)
我已成功在笔记本电脑的浏览器上运行此脚本,以便在两个Pis上运行ls -l
等简单命令,并在浏览器上打印出两者的结果。但是,我最终希望能够向两个Pis提供raspistill
命令。当我这样做时,只有服务器的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包的问题。
答案 0 :(得分:1)
在你的pi中,进入终端并输入sudo raspi-config
,然后使用键导航到相机,然后启用它。这将重启你。
来自https://www.raspberrypi.org/documentation/configuration/camera.md:
使用光标键移动到相机选项,然后选择“启用”。 在退出raspi-config时,它会要求重启。启用选项 将确保在重新启动时将运行正确的GPU固件 用相机驱动和调谐,GPU内存分裂是 足以让相机获得足够的内存来运行 正确。
在此之后,进入sudo raspi-config
并启用ssh(这是pi-camera的另一个选项)。此here
答案 1 :(得分:1)
在仔细阅读pssh
模块的文档后,我的问题与退出代码及其处理方式有关。
有关run_command
的文档声明:
函数将在连接和身份验证建立后以及命令发送到成功建立的SSH通道后返回。
结果:
因此,即使是退出代码也不会立即可用 立即退出的命令。
最初,我只是盲目地运行run_command
期望命令完成,但事实证明我需要获取退出代码才能真正完成命令运行的进程。文件说明了几种方法:
至少有一个
- 迭代stdout / stderr完成
- 调用
client.join(output)
是必要的,以使parallel-ssh
等待命令完成并能够收集退出代码。
这就是为什么在我对代码的修改中,我从stdout输出的命令似乎正常工作。