我必须将子进程的输出转储到以附加模式打开的文件
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']
答案 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'进程不会重置文件对象的当前流位置。