Как получить имя устройства WLAN с помощью Python? - PullRequest
1 голос
/ 07 ноября 2019

Мне нужно только имя устройства WLAN в системе Linux с Python. Я мог бы получить имя устройства с помощью сценариев оболочки:

echo /sys/class/net/*/wireless | awk -F'/' '{ print $5 }'

Так что я хочу использовать это на python с subprocess.

import shlex
import subprocess

def main():
    echo = shlex.split('echo /sys/class/net/*/wireless')
    echo_proc = subprocess.Popen(echo, shell=True, stdout=subprocess.PIPE)
    awk = shlex.split("awk -F'/' '{ print $5 }'")
    awk_proc = subprocess.Popen(awk, stdin=echo_proc.stdout)
    print(awk_proc.stdout)

Но я получаю только None в качестве вывода,Если это возможно, я бы предпочел решение с subprocess.run(). Поэтому я заменил Popen на run. Но тогда я получаю сообщение об ошибке AttributeError: 'bytes' object has no attribute 'fileno'.

1 Ответ

2 голосов
/ 07 ноября 2019

Глобус типа и расширение имени пути оболочкой будет головной болью.
В моей среде работает следующий фрагмент:

import subprocess
subprocess.run('echo /sys/class/net/*/wireless', shell=True)

Но следующее возвращает пустую строку:

import subprocess
subprocess.run(['echo', '/sys/class/net/*/wireless'], shell=True)

Тогда, пожалуйста, попробуйте следующее в качестве отправной точки:

import subprocess
subprocess.run('echo /sys/class/net/*/wireless | awk -F"/" "{ print \$5 }"', shell=True)

, который принесет желаемый результат.

[Обновить] Если вы хотите назначить переменную для выводавыше, пожалуйста, попробуйте:

import subprocess

proc = subprocess.run('echo /sys/class/net/*/wireless | awk -F"/" "{ print \$5 }"', shell=True, stdout = subprocess.PIPE)
wlan = proc.stdout.decode("utf8").rstrip("\n")
print(wlan)

Кстати, если вы не придерживаетесь модуля subprocess, почему бы вам не пойти по-родному как:

import glob
list = glob.glob('/sys/class/net/*/wireless')
for elm in list:
    print(elm.split('/')[4])

Надеждаэто помогает.

...