os.popen“sudo iwlist wlan0 scan”在独立运行时返回预期值,但在 FLASK 下不返回

问题描述 投票:0回答:1

我正在尝试更新我的 Raspberry Pi python 3.x 应用程序以扫描附近的 WiFi 网络,但我无法通过“sudo iwlist wlan0 scan”打破僵局。

作为独立脚本执行时没问题,但是当同一用户运行与 FLASK 应用程序相同的代码时,我会收到错误:要么是零输出,要么是可怕的

[Errno 2] No such file or directory: 'sudo'

这个独立的脚本在执行时返回所有附近的 WiFi 网络,无需从命令行执行 sudo: import os import getpass import subprocess output = os.popen("sudo iwlist wlan0 scan").read() # Works beautifully when stand-alone print(output) print(f'Effective user is {getpass.getuser()}')

输出:

pi@BenchPi3BPlus:~ $ python3 test.py wlan0 Scan completed : Cell 01 - Address: 11:22:BF:21:33:44 Channel:1 <edit> Cell 10 - Address: 55:55:EB:66:77:25 Channel:5 <edit> Effective user is pi pi@BenchPi3BPlus:~ $

...但是当我在烧瓶下尝试相同的操作时,我有一个“空”结果值:

app.logger.debug(f'Effective user is {getpass.getuser()}') output = os.popen("sudo iwlist wlan0 scan").read() app.logger.debug(f'SUCCESS: {output}')

[2023-11-06 09:49:54 +1100] [3983] [DEBUG] GET /network
[2023-11-06 09:49:55 +1100] [3983] [DEBUG] Effective user is pi
[2023-11-06 09:49:55 +1100] [3983] [DEBUG] SUCCESS: 
我读到建议说我的 FLASK 版本没有等待响应,所以我尝试了使用 subprocess.Popen 的不同方法,结果有相同的差异,并且在 FLASK 下有不同的失败:

import os import getpass import subprocess cmd = ["sudo", "iwlist", "wlan0", "scan"] result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, encoding='utf-8') (stdoutdata, stderrdata) = result.communicate() if stdoutdata: print(stdoutdata.strip()) if stderrdata: print(stderrdata.strip()) print(f'Effective user is {getpass.getuser()}')

输出:

pi@BenchPi3BPlus:~ $ python3 test2.py wlan0 Scan completed : Cell 01 - Address: 11:22:BF:21:33:44 Channel:1 <edit> Cell 10 - Address: 55:55:EB:66:77:25 Channel:5 <edit> Effective user is pi pi@BenchPi3BPlus:~ $

...然而,当从 FLASK 运行时,我得到了这个回报:

[2023-11-09 09:24:45 +1100] [11683] [DEBUG] GET /network [2023-11-09 09:24:46 +1100] [11683] [DEBUG] Effective user is pi [2023-11-09 09:24:46 +1100] [11683] [DEBUG] runSubprocess threw: [Errno 2] No such file or directory: 'sudo'

我已经尝试了所有我能找到的替代方案。我一定错过了一些基本的东西。请让我脱离痛苦。

python linux flask subprocess
1个回答
0
投票

事实证明

sudo

不是操作系统的内部命令 - 它是一个程序,当

subprocess.Popen
报告
No such file or directory
时,它试图向我指出这一点。
pi@BenchPi3BPlus:~ $ which sudo
/usr/bin/sudo
pi@BenchPi3BPlus:~ $

所以修复方法只是添加 sudo 的路径:

cmd = ["/usr/bin/sudo", "iwlist", "wlan0", "scan"] result = os.popen(cmd).read()

(奇怪的是,当我用 subprocess.Popen 尝试这个时,它仍然报告没有这样的文件或目录)

@ShadowRanger 是正确的建议我不应该这样做,但这是所问问题的答案。

更好的方法是将此请求转换为 systemctl 守护进程并从 Flask 中取出它,然后等待并读取响应。

© www.soinside.com 2019 - 2024. All rights reserved.