2013-12-16 4 views
-1

У меня есть программа, которая соответствует файлам Java в каталоге. Я хочу создать массив, связывающий имя файла с его консольным выходом. Я могу сделать массив, но мне нужно каким-то образом получить консольный вывод в строковой форме. Это, как я сейчас напечатать вывод:Получение строки из subprocess.call?

for fn in directoryContents: 
    if fn.rfind(".java") != -1: 
     subprocess.check_call(['javac', fn])  
     java_class,ext = os.path.splitext(fn) 
     className = fn[0: fn.rfind(".java")] 
     cmd = ['java', className] 
     subprocess.call(cmd, shell=False) 
     print ("\n") 
+0

См. [Subprocess doc] (http://docs.python.org/2/library/subprocess.html). Это очень ясно. – flyer

ответ

2

Вы должны использовать вместо subprocess.Popen:

p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE) 
somestr = p.stdout.readline() 
+0

использовать 'p.communicate() [0]' для поддержки нескольких строк вывода консоли. – jfs

1

subprocess.call принимает необязательный аргумент, стандартный вывод (как и поток ошибок), которые вы можете передать записываемый файловый объект. Вы можете либо передать ему StringIO, который затем сохранит вывод в строке, либо напишите его фактическому файлу, а затем прочитайте его, если вам нужно.

+0

Это неверно. Вы не можете передать 'StringIO' как параметр' stdout' в 'subprocess.call'. Он ожидает объект с допустимыми '.fileno()', например, обычные файлы, трубы (и сокеты в Unix). – jfs

+0

Я этого не знал. Где это документировано? – Thayne

+0

Из [docs] (http://docs.python.org/2/library/subprocess.html): «допустимыми значениями являются PIPE, существующий файловый дескриптор (положительное целое число), существующий файловый объект и None. " (слово «существующие» намекает, что простой файл-подобный объект, такой как StringIO, не будет принят, но он все еще неоднозначен). Вы можете [сообщить о проблеме с документацией] (http://bugs.python.org/). – jfs

2

Чтобы получить выход из команды, вы можете использовать subprocess.check_output():

import subprocess 

console_outputs = {fn: subprocess.check_output(["javac", fn]) 
        for fn in directoryContents if fn.endswith('.java')} 
+0

Единственное предостережение в том, что check_output генерирует исключение, если подпроцесс возвращает ненулевое значение, поскольку нет другого способа получить возвращаемое значение. – Thayne

+0

@Thayne: да. Это намерение. – jfs

+0

Я не говорю, что это не так, просто указывая, что может быть выбрано исключение. – Thayne

0

Вы можете использовать subprocess.check_output, которая возвращает результат выполнения команды.

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