当交互式会话中的相同代码执行时,为什么我的脚本不生成输出?

时间:2014-04-11 22:24:32

标签: python

我从pycrypto示例中得到了以下信息:

>>> from Crypto.Cipher import AES
>>> obj = AES.new('This is a key456', AES.MODE_ECB)
>>> message = "The answer is no"
>>> ciphertext = obj.encrypt(message)
>>> ciphertext
'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989'
>>> obj2 = AES.new('This is a key456', AES.MODE_ECB)
>>> obj2.decrypt(ciphertext)
'The answer is no'

现在我创建一个脚本:

#!/usr/bin/env python
from Crypto.Cipher import AES
obj = AES.new('This is a key456', AES.MODE_ECB)
message = "The answer is no"
ciphertext = obj.encrypt(message)
ciphertext
#'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989'
obj2 = AES.new('This is a key456', AES.MODE_ECB)
obj2.decrypt(ciphertext)

当我运行脚本时。我希望看到字符串输出

'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989'
'The answer is no'

但我没有得到任何东西。我试过了print ciphertext,但它打印了垃圾。

请帮忙。

4 个答案:

答案 0 :(得分:3)

您必须在要打印的内容上调用print函数(或py2中的print语句):

#!/usr/bin/env python
from Crypto.Cipher import AES
obj = AES.new('This is a key456', AES.MODE_ECB)
message = "The answer is no"
ciphertext = obj.encrypt(message)
print(ciphertext)
#'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989'
obj2 = AES.new('This is a key456', AES.MODE_ECB)
print(obj2.decrypt(ciphertext))

答案 1 :(得分:3)

您正在以非交互模式运行脚本。也就是说,你看到的例子是有人在终端上运行Python或类似的东西。

变量仅在单独调用时以交互模式打印出来。

答案 2 :(得分:1)

在脚本中,只是调用变量并不像在交互式shell中那样打印它。尝试将obj2.decrypt(ciphertext)保存为变量并致电print,或者只在print之前致电obj2.decrypt(ciphertext)

#!/usr/bin/env python
from Crypto.Cipher import AES
obj = AES.new('This is a key456', AES.MODE_ECB)
message = "The answer is no"
ciphertext = obj.encrypt(message)
ciphertext
#'o\x1aq_{P+\xd0\x07\xce\x89\xd1=M\x989'
obj2 = AES.new('This is a key456', AES.MODE_ECB)
x = obj2.decrypt(ciphertext)
print(x)
#or, just print obj2.decrypt(ciphertext)

答案 3 :(得分:1)

将变量单独放在一行上并不会将其打印出来。您需要使用print语句(或函数,如果在python 3中)来执行此操作。

您需要了解REPL是什么,以及它与脚本的区别。

在REPL中,键入一行,对其进行求值,然后打印生成的对象。在python的情况下,如果结果对象计算为None,则生成的对象打印,这就是为什么示例中只有两行产生任何输出。

所以,在你的脚本中,而不是:

obj2.decrypt(ciphertext)

执行:

print obj2.decrypt(ciphertext)

或者,如果您想获得与REPL完全相同的输出,请执行以下操作:

print repr(obj2.decrypt(ciphertext))

但这不太可能是你想要的。