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

私のOSXでは、Python2.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、既存のファイル記述子(正の整数)、既存のファイルオブジェクト、およびNoneです。PIPEは、子への新しいパイプを作成する必要があることを示します。DEVNULLは、特殊ファイルos.devnullが使用されることを示します。デフォルト設定のNoneでは、リダイレクトは発生しません。子のファイルハンドルは親から継承されます。さらに、stderrはSTDOUTにすることができます。これは、アプリケーションからのstderrデータをstdoutの場合と同じファイルハンドルにキャプチャする必要があることを示します。

したがって、「Popen」プロセスはファイルオブジェクトの現在のストリーム位置をリセットしません。

于 2013-01-27T11:35:19.750 に答える