无法通过网络浏览器访问 pi 相机
Unable to access pi camera through web browser
我正在写一个 Python CGI 脚本,我想 运行 在我笔记本电脑的浏览器上。该脚本将通过 SSH 连接到两个树莓派,并发出拍照命令。托管此脚本的服务器位于我想通过 SSH 连接到的一个树莓派上,该树莓派还充当另一个树莓派和我的笔记本电脑连接的接入点(一切都是局域网,未连接到互联网) .
我成功地 运行 我笔记本电脑浏览器上的这个脚本在两个树莓派上 运行 像 ls -l
这样的简单命令,并在浏览器上打印出两者的结果。但是,我最终希望能够向两个树莓派发出 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 包的问题。
在你的 pi 中,进入终端并输入 sudo raspi-config
,然后使用相机键导航,然后启用它。这将重新启动你的 pi。
来自 https://www.raspberrypi.org/documentation/configuration/camera.md:
Use the cursor keys to move to the camera option, and select 'enable'.
On exiting raspi-config, it will ask to reboot. The enable option
will ensure that on reboot the correct GPU firmware will be running
with the camera driver and tuning, and the GPU memory split is
sufficient to allow the camera to acquire enough memory to run
correctly.
在此之后,进入 sudo raspi-config
并启用 ssh(这是另一个选项,就像 pi-camera)。 Link 对于这个 here
通读 pssh
模块的文档后,我的问题与退出代码及其处理方式有关。
关于 run_command
的文档指出:
function will return after connection and authentication establishment and after commands have been sent to successfully established SSH channels.
结果:
Because of this, exit codes will not be immediately available even for
commands that exit immediately.
最初,我只是盲目地 运行 run_command
期望命令完成,但事实证明我需要获取退出代码才能真正完成命令的进程 运行.文档说明了执行此操作的几种方法:
At least one of
- Iterating over stdout/stderr to completion
- Calling
client.join(output)
is necessary to cause parallel-ssh
to wait for commands to finish and be able to gather exit codes.
这就是为什么在我对代码的修改中,我从 stdout 输出的地方,命令似乎正常工作。
我正在写一个 Python CGI 脚本,我想 运行 在我笔记本电脑的浏览器上。该脚本将通过 SSH 连接到两个树莓派,并发出拍照命令。托管此脚本的服务器位于我想通过 SSH 连接到的一个树莓派上,该树莓派还充当另一个树莓派和我的笔记本电脑连接的接入点(一切都是局域网,未连接到互联网) .
我成功地 运行 我笔记本电脑浏览器上的这个脚本在两个树莓派上 运行 像 ls -l
这样的简单命令,并在浏览器上打印出两者的结果。但是,我最终希望能够向两个树莓派发出 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 包的问题。
在你的 pi 中,进入终端并输入 sudo raspi-config
,然后使用相机键导航,然后启用它。这将重新启动你的 pi。
来自 https://www.raspberrypi.org/documentation/configuration/camera.md:
Use the cursor keys to move to the camera option, and select 'enable'. On exiting raspi-config, it will ask to reboot. The enable option will ensure that on reboot the correct GPU firmware will be running with the camera driver and tuning, and the GPU memory split is sufficient to allow the camera to acquire enough memory to run correctly.
在此之后,进入 sudo raspi-config
并启用 ssh(这是另一个选项,就像 pi-camera)。 Link 对于这个 here
通读 pssh
模块的文档后,我的问题与退出代码及其处理方式有关。
关于 run_command
的文档指出:
function will return after connection and authentication establishment and after commands have been sent to successfully established SSH channels.
结果:
Because of this, exit codes will not be immediately available even for commands that exit immediately.
最初,我只是盲目地 运行 run_command
期望命令完成,但事实证明我需要获取退出代码才能真正完成命令的进程 运行.文档说明了执行此操作的几种方法:
At least one of
- Iterating over stdout/stderr to completion
- Calling
client.join(output)
is necessary to causeparallel-ssh
to wait for commands to finish and be able to gather exit codes.
这就是为什么在我对代码的修改中,我从 stdout 输出的地方,命令似乎正常工作。