Python:使用Popen()和File Objects写入linux中的文件

时间:2013-03-18 19:23:41

标签: python linux popen

我注意到我有两种方法可以在python脚本中写入Linux中的文件。我可以创建一个Popen对象并使用shell重定向写入文件(例如“>”或“>>”) - 或者我可以使用文件对象(例如open(),write(),close()) 。

我已经和他们玩了一会儿,并注意到如果我需要使用其他shell工具,使用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,但我不确定我应该采用哪种方式。

2 个答案:

答案 0 :(得分:2)

一般来说,我会写一些类似的东西:

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

这可以避免任何shell注入漏洞。您还知道PID,因为您没有获取生成的子shell的PID。

答案 1 :(得分:2)

修改:不推荐使用md5模块(但仍在使用中),而应使用hashlib module

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 module提供了一个相同的工具:

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十六进制摘要字符串,则可以将其打印出来并将其写入文件:

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