我试图更新我的Raspberry Pi python 3.x app扫描附近的WiFi网络,但我无法通过“sudo iwlist wlan0 scan”的僵局。
当作为独立脚本执行时,它很好,但是当JavaScript用户运行与FLASK应用程序相同的代码时,我会得到错误:要么是零输出,要么是可怕的[Errno 2] No such file or directory: 'sudo'
这个独立的脚本在命令行中执行 * 而不使用 * sudo时返回附近的所有WiFi网络:
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:~ $
型
.然而,当我在flask下尝试相同的操作时,我得到了一个“空”的结果值:
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'
型
我已经尝试了所有我能找到的选择。我一定是错过了一些基本的和基本的东西。请让我摆脱我的痛苦。
1条答案
按热度按时间e4yzc0pl1#
好吧,我说当我问这个问题的时候,我认为解决办法很简单。我没有意识到它是这么简单。
这表明
sudo
不是操作系统的内部命令-它是一个程序,当subprocess.Popen
报告No such file or directory
时,它试图向我指出这一点。字符串
因此,修复方法只是将路径添加到sudo:
型
(奇怪的是,当我尝试使用子进程时。Popen仍然报告没有这样的文件或目录)
@ShadowRanger建议我不应该这样做是正确的,但这是问题的答案。
更好的方法是将此请求转换为systemctl守护进程,并从Flask中插入它,然后等待并读取响应。