2013-12-16 140 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

从[文档](http://docs.python.org/2/library/subprocess.html):“有效值是PIPE,现有文件描述符(正整数),现有文件对象和无。 “ ('现有'一词暗示像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,返回命令的输出。