2017-08-04 312 views
1

我正在写一个Python CGI脚本,我想在我的笔记本电脑的浏览器上运行。这个脚本将SSH连接到两个Pis,并给出命令拍摄照片。托管此脚本的服务器位于我希望进入SSH的Pis之一,并且该Pi也充当其他Pi和我的笔记本电脑连接的访问​​点(所有内容都是LAN,未连接到Internet) 。无法通过网络浏览器访问pi相机

我成功地在笔记本电脑的浏览器上运行此脚本,在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 I输出任何东西,它工作正常。为什么会这样?是等着我冲洗输出还是什么?我怀疑这可能是我使用的pssh软件包的问题。

回答

1

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

文档有关run_command指出:

功能连接和认证成立后返回,并命令已被送往成功建立SSH通道后。

而作为一个结果:

正因为如此,退出代码不会立即即使 立即命令该出口可用。

起初,我只是一味地运行run_command期待的命令到结束,但事实证明,我需要的退出代码真正完成命令正在运行的进程。本细则规定一对夫妇的方式做到这一点:

至少

  • 迭代超过标准输出/标准错误来完成
  • 调用client.join(output)需要引起parallel-ssh等待命令完成一个并能够收集退出代码。

这就是为什么我修改了代码,在那里我是从标准输出输出,命令似乎正常工作。

1

在您的pi中,进入终端并键入sudo raspi-config,然后用钥匙导航至相机,然后启用它。这会重新启动你的pi。 从https://www.raspberrypi.org/documentation/configuration/camera.md

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

之后,进入sudo raspi-config并启用ssh(这是另一种选择就像pi-camera)。此链接here

+0

我在两个Pis上都启用了摄像头和ssh接口。它已经开始工作了。显然,我需要输出一些照片来拍摄,正如我的代码修正中所指出的那样。我不知道为什么会这样。 –

相关问题