2016-04-18 3 views
1

Я хочу, чтобы выполнить эту команду из питона сценария:Выполнить команду оболочки из Python Script

iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f > scan.txt 

Я попытался как следующий

from subprocess import call 
call(["iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f > scan.txt"]) 

, но я получаю сообщение об ошибке

SyntaxError: EOL while scanning string literal 

Как я могу это сделать?

+0

Вы можете попробовать первый: 'импорт os', а затем:' os.system ("IW wlan0 сканирование | СЭД -e«s # (на wlan # (на wlan # g '| awk -f scan.txt ")' m –

+0

Отсутствие аргумента в 'awk -f' является ошибкой. Предположительно у вас есть файл сценария, который вы хотите запустить. – tripleee

ответ

3

Pass shell=True в subprocess.call:

call("iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.txt", shell=True) 

Обратите внимание, что shell=True не является безопасным вариантом всегда.

+1

' shell = True' запускает команду так, как если бы вы ввели ее в терминал вашей ОС. Это означает, что если это фиксированная строка, которую вы проверили, это довольно безопасно. Но ** никогда не используйте 'shell = True', если часть команды не является постоянной, но из небезопасных (например, пользовательский ввод). Представьте себе: 'text = input(); call ("echo" + text, shell = True) 'и пользователь вводит' Я ненавижу вас; rm -rf/' –

0

Устанавливая shell=True и удаляя скобки списка вокруг строки, вы решите ближайшую проблему, запустив sed и Awk из Python просто сумасшедший.

import subprocess 
iw = subprocess.check_output(['is', 'wlan0', 'scan']) # shell=False 
with open('scan.txt', 'r') as w: 
    for line in iw.split('\n'): 
    line = line.replace('(on wlan', ' (on wlan') 
    # ... and whatever your Awk script does 
    w.write(line + '\n') 
0

Модуль commands проще в использовании:

import commands 
output = commands.getoutput("iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.txt") 
Смежные вопросы