0

Python スクリプト内で Linux のファイルに書き込むには、2 つの方法があることに気付きました。Popen オブジェクトを作成し、シェル リダイレクション (例: ">" または ">>") を使用してファイルに書き込むか、ファイル オブジェクト (例: open()、write()、close()) を使用できます。

私はしばらく両方を試してみましたが、他のシェル ツールを使用する必要がある場合、Popen を使用するとコードが少なくて済むことに気付きました。たとえば、次の例では、ファイルのチェックサムを取得し、PID を一意の識別子として名前を付けた一時ファイルに書き込もうとしています。(Popen を再度呼び出すと $$ が変更されることはわかっていますが、その必要がないふりをします):

Popen("md5sum " + filename + " >> /dir/test/$$.tempfile", shell=True, stdout=PIPE).communicate()[0]

以下は、ファイルオブジェクトを使用した(急いで書いた)大まかな等価物です。$$ の代わりに os.getpid を使用していますが、まだ md5sum を使用しており、Popen を呼び出す必要があります。

PID = str(os.getpid())
manifest = open('/dir/test/' + PID + '.tempfile','w')
hash = Popen("md5sum " + filename, shell=True, stdout=PIPE).communicate()[0]
manifest.write(hash)
manifest.close()

どちらのアプローチにも長所/短所はありますか? 私は実際に bash コードを Python に移植しようとしており、さらに Python を使用したいと考えていますが、ここでどの方法を使用すればよいかわかりません。

4

2 に答える 2

2

一般的に言って、私は次のようなものを書きます:

manifest = open('/dir/test/' + PID + '.tempfile','w')
p = Popen(['md5sum',filename],stdout=manifest)
p.wait()
manifest.close()

これにより、シェルインジェクションの脆弱性が回避されます。生成されたサブシェルのPIDを取得していないため、PIDもわかっています。

于 2013-03-18T19:30:34.653 に答える
2

編集:md5モジュールは非推奨です(ただし、まだあります)。代わりに、hashlibモジュールを使用する必要があります

hashlib バージョン

ファイルへ:

import hashlib
with open('py_md5', mode='w') as out:
    with open('test.txt', mode='ro') as input:
        out.write(hashlib.md5(input.read()).hexdigest())

コンソールに:

import hashlib
with open('test.txt', mode='ro') as input:
    print hashlib.md5(input.read()).hexdigest()

md5 バージョン Python のmd5 モジュールは、同一のツールを提供します。

import md5
# open file to write
with open('py_md5', mode='w') as out:
    with open('test.txt', mode='ro') as input:
        out.write(md5.new(input.read()).hexdigest())

md5 16 進数のダイジェスト文字列を取得したいだけの場合は、ファイルに書き出す代わりに印刷できます。

import md5
# open file to write
with open('test.txt', mode='ro') as input:
    print md5.new(input.read()).hexdigest()
于 2013-03-18T19:41:33.100 に答える