6

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

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']
4

2 回答 2

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
于 2014-01-02T13:05:01.893 回答
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 文档中:

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

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

于 2013-01-27T11:35:19.750 回答