2017-02-21 6 views
0

У меня есть список, содержащий целые числа, и вы хотите направить его на команду оболочки, которая создает из нее гистограмму (см. here).Python - целые числа в качестве входных данных для подпроцесса.Popen

В настоящем время, давайте подражать генераторную гистограмму сценария с помощью простого скрипта echo_script.sh оболочки, который повторяет все входной:

#/bin/sh 
echo [email protected] 

Изнутри Python, я хотел бы, чтобы направить содержимое списка этой команде , Я предполагаю, что это связано с некоторыми попытками с subprocess.

numbers = [1, 2, 3] 
# subprocess stuff, writing numbers to stdin of echo_script.sh process? 

Я хотел бы иметь следующий вывод на стандартный вывод:

1 2 3 

Следует заметить, что я в курсе решений, которые включают хранение содержимого списка во временном файле и трубопроводах этого файл echo_script.sh , Я бы хотел этого избежать.

EDIT: Сценарий histogram.py, с которым я работаю, не поддерживает чтение в произвольном количестве добавленных аргументов, например echo 1 2 3. Он читается только с stdin. Следовательно, приведенный выше пример вводит в заблуждение. Подход, который я постарался:

proc = subprocess.Popen(["wc", "-l"], stdin=subprocess.PIPE) 
proc.stdin.write(bytes([42])) 

Это выводит 1, который является правильным количеством строк, но фактически количеством записанных байтов. Поэтому у меня есть еще два вопроса:

  • Как правильно использовать массив байтов для отправки в proc.stdin.write?
  • Как я могу перенаправить stdout proc на текущий процесс?

ответ

-2

Что-то вроде этого?

import subprocess 

path_to_script = "./echo_script.sh" 
numbers = [1, 2 ,3] 
numbers_str = ' '.join(str(i) for i in numbers) # should give you '1 2 3' 

subprocess.call([path_to_script, numbers_str]) 

Edit для правки:

Я думаю, что вам, возможно, придется использовать subprocess.Popen тогда. Это может сработать:

import subprocess 

script = "/path/to/script.py" 

numbers = [1, 2 ,3] 
numbers_str = ' '.join(str(i) for i in numbers) + '\n' # should give you '1 2 3' 

proc = subprocess.Popen(script, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
proc.stdin.write(numbers_str) 
proc.stdin.close() 
print(proc.stdout.read()) 
+0

Этот подход полезен для примера «echo». Однако он работает не с данным сценарием. Я отредактировал мой вопрос. Спасибо за вашу помощь! Я был бы счастлив, если бы у вас был другой взгляд. – pylipp

+0

Ваше редактирование поставит меня на правильный путь, спасибо! Я применил некоторые изменения: я присоединил числа, используя символ новой строки. 'proc.std.write()' требует байтового объекта, поэтому я конвертирую 'numbers_str' через' bytearray (numbers_str, 'utf-8') '. То же самое касается вывода 'read', поэтому я помещаю' .decode() '. – pylipp

0

Это то, что вы пытаетесь достичь?

import subprocess 
l = [1, 2, 3] 
l = ' '.join(str(x) for x in l) 
subprocess.call(["./echo_script.sh {}".format(l)], shell=True) 
+0

Если это число в строке, то изменение «.» .Join (str (x) для x в l) 'to' '\ n'.join (str (x) для x в l) 'должен работать. – AJPennster

+0

Этот подход полезен для примера эха. Однако он работает не с данным сценарием. Я редактировал мой вопрос, сожалею о недоразумении. Спасибо за вашу помощь! Я был бы счастлив, если бы у вас был другой взгляд. – pylipp