2015-07-22 2 views
-1

Я новичок в написании сценариев. У меня есть эта строка в bash, которую я пытаюсь написать на python.python subprocess & popen invalid синтаксис

numcpu = ($(cat /proc/cpuinfo | grep 'physical id' | awk '{print $NF}' | sort | uniq | wc -l)) 

Я пробовал использовать sub и popen и не мог заставить его работать. Вот строка:

numcpu = sub.Popen('($(cat /proc/cpuinfo | grep 'physical id' | awk '{print $NF}' | sort | uniq | wc -l))',stdout=sub.PIPE,stderr=sub.PIPE) 

Он продолжает бросать ошибки. Любые идеи о том, что проблема, или как я могу это сделать? Я знаю, может быть, импорт и вызов os?

Я использую Python v2.6, и я не могу обновить.

+3

так как же Python знать, где строка начинается или заканчивается, если вы используете одни и те же цитаты, которые содержатся в строке? –

+1

Кроме того, при обращении за помощью с ошибкой * укажите сообщение об ошибке *. Для Python это означает, что полная полная трассировка должна быть включена в ваш вопрос, поэтому нам не нужно догадываться об ошибке, которую вы получаете. –

ответ

1

Так как должен Python знать, где строка начинается или заканчивается, если вы используете те же кавычки, что и в строке? Переключитесь на использование " двойных кавычек, чтобы заключить команду оболочки.

Кроме того, вы должны будете сказать subprocess использовать оболочку для запуска команды, в противном случае это будет просто пытаться выполнить команду непосредственно (и, следовательно, не поддерживает синтаксис оболочки):

numcpu = sub.Popen("($(cat /proc/cpuinfo | grep 'physical id' | awk '{print $NF}' | sort | uniq | wc -l))", 
        shell=True, stdout=sub.PIPE, stderr=sub.PIPE) 

You можете просто читать proc/cpuinfo непосредственно, и процесс, в Python:

cpu_ids = set() 
with open('/proc/cpuinfo') as cpuinfo: 
    for line in cpuinfo: 
     if 'physical id' in line: 
      cpu_ids.add(line.rsplit(None, 1)[-1]) 
numcpu = len(cpu_ids) 
Смежные вопросы