2013-03-18 139 views
0

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

我已经玩了一会儿,注意到如果我需要使用其他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

一般来说,我会写这样的:

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

这可避免外壳注入漏洞。你也知道PID,因为你没有选择产生的子shell的PID。

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十六进制消化字符串,可以打印insted的写出来,以一个文件:

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