2013-10-17 77 views
1

我写了非常小的脚本并尝试捕获脚本的输出。我写了多个时间类似的方式,但从来没有问题。我可以提供意见吗?我觉得我做的很愚蠢的错误捕获Python脚本输出

numpy_temp = """ 
import numpy 
import sys 
a, b, c = numpy.polyfit(%s,%s, 2) 
print a, b, c""" %(x, y) 
fp_numpy = open("numpy_temp.py", "w") 
fp_numpy.write(numpy_temp) 
cmd = "/remote/Python-2.7.2/bin/python numpy_temp.py " 
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, 
      stderr = subprocess.PIPE, shell = True) 
out, err = proc.communicate() 
print "out", out 
+1

也许你实际上得到了stderr反应。尝试'打印出来,错误',看看你有什么。 – sberry

回答

2

你从来没有真正关闭fp_numpy,所以脚本可以在你尝试运行它的时候空或不完整。

这不是保证是空的,但它非常可能。当我在两个具有7种不同版本的Python的不同版本的nix计算机上试用这个版本时,它每次都是空的......(事实上,脚本完成后,文件被关闭并因此被刷新,使得调试更难。)

解决这个问题的最好办法是使用with语句,所以它不可能忘记关闭文件:

with open("numpy_temp.py", "w") as fp_numpy: 
    fp_numpy.write(numpy_temp) 

但除此之外,你已经得到了另一个问题。如果生成的脚本产生一个异常,它将不会向stdout输出任何内容,并会将traceback转储到您将读取并忽略的stderr。当你忽略错误时,调试问题非常困难......我不知道你通过了xy,但是如果你通过了numpy.array而不是一个评估为1的字符串,那么你可以很容易地得到一个例外,永远不会看到它将stderr发送到stdout,或者在末尾发送print "err", err

最后,你真的不应该使用一个命令字符串和shell=True在这里,因为你最终得到额外的间接水平没有很好的理由,它可以使事情变得更难调试。只要这样做:

cmd = ["/remote/Python-2.7.2/bin/python", "numpy_temp.py"] 
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, 
         stderr = subprocess.PIPE) 
+0

确实,文件没有关闭,并且随后是空的。 – sberry

0

使用print outprint "out"

+0

两种方式相同的结果。在复制代码期间错过了它 – user765443

0

退房这种方法

see.py

 
for line in range(6): 
    print line 

我@ pubx:〜$蟒蛇see.py>所有

0

我不知道为什么你要编写捕获脚本输出的脚本(也许你有一个很好的理由)。使用shell这种任务更容易。

创建您的numpy_temp.py,然后将其输出到一个文件。

/remote/Python-2.7.2/bin/python numpy_temp.py > output.txt 

将数据追加到现有的文件中使用

/remote/Python-2.7.2/bin/python numpy_temp.py >> output.txt