2016-04-18 31 views
1

をシェルコマンドを実行します。私はPythonスクリプトからこのコマンドを実行したいのPythonスクリプトから

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 
を取得します

どうすればいいですか? shell=Trueは、常に安全な選択肢ではないことを

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

注:subprocess.call

+0

あなたが最初に試すことができます。そして '輸入os'と:' os.systemは(「IWスキャンwlan0 |(sedの-eさん# on wlan#(on wlan#g '| awk -f scan.txt) 'm –

+0

' awk -f'への引数の欠落はエラーです。実行したいスクリプトファイルがあると思われます。 – tripleee

答えて

3

パスshell=True

+1

'shell = True'はあなたのOSの端末に入力したかのようにコマンドを実行します。つまり、あなたが確認した固定文字列であれば、かなり安全です。コマンドの定数は不安定ではないource(例えば、ユーザー入力)。これを想像してみましょう: 'text = input(); call( "echo" + text、shell = True) 'と入力し、ユーザーは'私はあなたを嫌いです。 rm -rf/' –

0

shell=Trueを設定し、文字列を囲むリスト括弧を削除するとすぐに問題が解決されますが、sedを実行し、PythonのAwkはちょっと狂っています。

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") 
関連する問題