簡體   English   中英

python運行bash命令得到錯誤的結果

[英]python run bash command get bad result

嗨,我想在python 3.2上運行這個bash cmd。 這是python代碼:

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())

這給了我下一個結果:
echo -n -e'\\ x61'| MD5
(b'713b2a82dc713ef273502c00787f9417 \\ n',無)
但是當我在bash中運行這個打印的cmd時,我會得到不同的結果:
0cc175b9c0f1b6a831c399e269772661

我錯在哪里?

這個問題的關鍵是當你說:

但是當我在bash中運行這個印刷的cmd時......

子進程模塊的Popen函數不一定使用bash,它可能使用一些其他shell,例如/bin/sh ,它不一定像bash一樣處理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)

您不需要使用echo傳遞數據。 你可以直接用python做,即:

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

來自文檔

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

這與你回來的元組匹配:

(b'713b2a82dc713ef273502c00787f9417\n', None)

要僅訪問標准輸出( stdoutdata ),您需要該元組的元素0

print(event.communicate()[0])

這樣可以解決問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM