以附加模式转储文件中的子进程输出

时间:2013-01-15 06:20:11

标签: python file-io subprocess

我必须将子进程的输出转储到以附加模式打开的文件

from subprocess import Popen

fh1 = open("abc.txt", "a+") # this should have worked as per my understanding

# fh1.readlines() # Adding this solves the problem 

p = Popen(["dir", "/b"], stdout = fh1, shell=True)

print p.communicate()[0]
fh1.close()

上面的代码会覆盖我不想要的文件abc.txt,取消注释fh1.readlines()会将光标移动到适当的位置,这是一个临时的解决方案

我有什么基本缺失。

In [18]: fh1 = open("abc.txt",'a')

In [19]: fh1.tell() # This should be at the end of the file
Out[19]: 0L

In [20]: fh1 = open("abc.txt",'r')

In [21]: print fh1.readlines()
['1\n', '2\n', '3\n', '4\n', '5\n']

2 个答案:

答案 0 :(得分:2)

将光标放在文件末尾而不读取它的简单方法是使用:

fh1.seek(2)
# .seek(offset, [whence]) >> if offset = 2 it will put the cursor in the given position relatively
# to the end of the file. default 'whence' position is 0, so at the very end

答案 1 :(得分:0)

在我的OS X中,python 2.7和3.3都可以正常工作。

adylab:Downloads adyliu$ cat ./a.txt
a
b
c
d
e
f
adylab:Downloads adyliu$ python -V
Python 2.7.2
adylab:Downloads adyliu$ python3 -V
Python 3.3.0
adylab:Downloads adyliu$ python -c "print(open('./a.txt','a').tell())"
12
adylab:Downloads adyliu$ python3 -c "print(open('./a.txt','a').tell())"
12

在python doc中:

  

stdin,stdout和stderr指定执行程序的标准   输入,标准输出和标准错误文件句柄。   有效值为PIPE,DEVNULL,现有文件描述符(a   正整数),现有文件对象,无。 PIPE表示   应该创建一个给孩子的新管道。 DEVNULL表示   将使用特殊文件os.devnull。使用默认设置   无,不会发生重定向;孩子的文件句柄将是   继承自父母。另外,stderr可以是STDOUT,其中   表示来自应用程序的stderr数据应该是   捕获到与stdout相同的文件句柄。

因此'Popen'进程不会重置文件对象的当前流位置。