2014-12-17 2 views
0
ip = subprocess.Popen(["/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'"], stdout=subprocess.PIPE) 

Я не знаю, где положить запятые для их разделения, чтобы использовать эту команду, используя subprocess.Popen. Кто-нибудь знает?Как разделить команду здесь для использования subprocess.Popen()

+0

Использование [ 'shlex.split'] (https://docs.python.org/2/library/shlex.html#shlex .Трещина). –

+0

Как именно это использовать? – user2921139

+0

Просто импортируйте модуль и сделайте 'shlex.split ('ваша длинная команда')' –

ответ

0

Вот что я бы рекомендовал.

Создайте файл с этим содержимым - назовем это «маршрут-инфо» и сделать его исполняемым:

#!/bin/sh 

/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | 
    grep "inet addr" | 
    awk -F: '{print $2}' | 
    awk '{print $1}' 

В вашей питона программы, использование:

ip = subprocess.Popen(["/path/to/route-info"], stdout=subprocess.PIPE) 

Тогда у вас нет беспокоиться о цитировании символов, и вы можете самостоятельно протестировать сценарий route-info, чтобы убедиться, что он работает правильно.

Сценарий route-info не принимает никаких аргументов командной строки, но если он сделал это, как вы бы передать их:

ip = subprocess.Popen(["/path/to/route-info", arg1, arg2, ...], stdout=subprocess.PIPE) 
+0

Супер! Спас мой день. Не могли бы вы также рассказать мне, что будет работать на Mac, и как эта информация о маршруте может отличить Mac от вышеуказанного, что я собираюсь использовать для CentOS? – user2921139

+0

Чтобы найти маршрут по умолчанию в OSX, используйте 'route -n get default'. Я думаю, что вы должны просто создавать конкретные версии для каждой ОС и устанавливать правильную при установке скрипта - то есть определять ОС во время установки, а не во время выполнения. – ErikR

3

Вы используете функции оболочки (трубу), так вместо того, разделяя команду , вы должны передать его в виде одной строки (а не список) с shell=True

ip = subprocess.Popen("/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'", 
    shell=True, 
    stdout=subprocess.PIPE) 
+0

собираюсь попробовать! – user2921139

+0

Да, это тоже работает. – user2921139

Смежные вопросы