2011-05-10 77 views
3

嗨我想在python 3.2上運行這個bash cmd。下面是Python代碼:蟒蛇運行bash命令得到錯誤結果

message = '\\x61' 
shell_command = "echo -n -e '" + message + "' | md5" 
print(shell_command) 
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
print(event.communicate()) 

這給了我一個結果:
回聲-n -e'\ x61的| MD5
(b'713b2a82dc713ef273502c00787f9417 \ N」,無)

但是當我運行在bash這個印刷CMD,我得到不同的結果:
0cc175b9c0f1b6a831c399e269772661

如果我做了錯誤?

+0

好奇,它在Python 2.5對我的作品(即返回0cc175b9c0f1b6a831c399e269772661) – 2011-05-10 00:37:50

+0

但是,如果你真的wnat是MD5哈希值,只需使用hashlib模塊(和它的md5函數)。 – Keith 2011-05-10 02:09:33

回答

3

的關鍵對此問題是當你說:

但是,當我運行在bash這個印刷CMD ...

的子模塊的Popen功能不一定使用bash,它可以使用一些其他的殼如/bin/sh這不一定相同處理echo命令慶典。在我運行在bash命令系統產生相同的結果,你得到:

$ echo -n -e '\x61' | md5sum 
0cc175b9c0f1b6a831c399e269772661 - 

但是,如果我在/bin/sh運行命令我得到:

$ echo -n -e '\x61' | md5sum 
20b5b5ca564e98e1fadc00ebdc82ed63 - 

這是因爲/bin/sh在我的系統沒有按」不瞭解-e選項,也不瞭解\x轉義序列。

如果我在Python運行代碼我得到同樣的結果,好像我用/bin/sh

>>> cmd = "echo -n -e '\\x61' | md5sum" 
>>> event = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT) 
>>> print event.communicate() 
('20b5b5ca564e98e1fadc00ebdc82ed63 -\n', None) 
0

the docs

communicate()返回一個元組(stdoutdata, stderrdata)

與你回來的元組相匹配:

(b'713b2a82dc713ef273502c00787f9417\n', None) 

要訪問只是標準輸出(stdoutdata),你想要的元組的元素0

print(event.communicate()[0]) 
0

這會做的伎倆:

>>> p=Popen('echo -n \x61 |md5sum',shell=True,stdout=PIPE) 
>>> p.communicate() 
(b'0cc175b9c0f1b6a831c399e269772661 -\n', None) 
1

你不需要使用回聲傳遞數據。您可以直接與蟒蛇做,即:

Popen('/usr/bin/md5sum', shell=False, stdin=PIPE).communicate('\x61')