0

私はPython開発に不慣れです。ファイル(tmp.addr2line)に何かを書き、このファイルに対してシェルコマンドを実行しようとしています。しかし、シェルコマンドで使用されているファイルと作成したばかりのファイルを比較すると、それらは異なり、使用されているファイルは小さくなっています。

私のコードがあります(subprocess.callで実行されるコマンドは最後のものではありません)。

test = open("tmp.addr2line", "w") 
for i in __coverage_information__:
    test.write(i.address + "\n")
test.close
subprocess.call("wc tmp.addr2line", shell = True)

戻る

268697  268698 2686976 tmp.addr2line

そして、Pythonスクリプトの後にwc tmp.addr2lineを実行すると、次のようになります。

271710  271710 2717100 tmp.addr2line

そのため、行が欠落しており、理由がわかりません。あなたが私を助けてくれることを願っています。

4

3 に答える 3

2

ファイルを閉じていません。close関数を呼び出す必要があります。

test.close()

あなたがいなければ、()実際に関数を呼び出すのではなく、関数を参照するだけです。ファイルを適切に閉じるまで、書き込みバッファはフラッシュされず、部分的な書き込みのみが表示されます。

withステートメント内のコンテキストマネージャーとしてファイルを使用できます。ステートメントの下のブロックが完了すると、ファイルはまったくwith呼び出す必要なしに自動的に閉じられます。close()

with open("tmp.addr2line", "w") as test:
    for i in __coverage_information__:
        test.write(i.address + "\n")

shell=True可能な限りパラメータを避け、代わりにこれを使用することをお勧めします。

subprocess.call(["wc", "tmp.addr2line"])
于 2013-01-04T12:23:06.643 に答える
2

withステートメントを使用して、ファイルが確実に閉じられるようにする必要があります。

with open(filename, 'w') as fd:
    fd.write(data)
于 2013-01-04T12:43:59.890 に答える
0

「閉じる」後に角かっこを外しました。これには、スクリプトでwcを実行したときに、関数が呼び出されず、ファイルがディスクに完全に書き込まれないという効果があります。スクリプトが終了すると、インタープリターは自動的にファイルを閉じ、バッファリングされたコンテンツを書き込むため、その後、wcの正しい出力が表示されます。

于 2013-01-04T12:23:20.370 に答える