2012-08-01 33 views
0

我正在使用Python M2Crypto包生成RSA密钥。有没有办法抑制Python M2Crypto的RSA.gen_key输出?

>>> import M2Crypto 
>>> rsa = M2Crypto.RSA.gen_key (2048, 65537) 
.............................................................+++ 
............................+++ 
>>> 

请注意“openssl stuff”。要抑制写入标准输出/ err我通常这样做:

sys.stdout = open(os.devnull, 'w') 
sys.stderr = open(os.devnull, 'w') 

这在这种情况下没有效果。我假设这与M2Crypto封装OpenSSL的方式有关。

有没有办法阻止它?

回答

3

我看着源码/M2Crypto/RSA.py,发现你的问题是什么,然后意识到我可以刚刚阅读文档。 总是先查看文档!!!

按照docs for RSA.gen_keygen_key有一个叫callback可选的参数,它允许您指定要调用的函数,只要gen_key被称为(表面上是为了提供反馈给用户)。此回调的默认值打印到stdout。改变你的函数调用:

>>> rsa = M2Crypto.RSA.gen_key (2048, 65537, callback=lambda x, y, z:None) 

它应该做的伎俩。

EDIT

下面是从M2PyCrypto源相关的代码。我添加了评论。

def keygen_callback(p, n, out=sys.stdout): #sys.stdout is bound to `out` at definition time 
    """ 
    Default callback for gen_key(). 
    """ 
    ch = ['.','+','*','\n'] 
    out.write(ch[p]) 
    out.flush() 


def gen_key(bits, e, callback=keygen_callback): #keygen_callback is bound to `callback` 
    #other code... 
+0

谢谢!方法定义中的out = sys.stdout赋值是在模块使用python加载时完成的,而不是在调用方法时完成的?我仍然不确定为什么将sys.stdout设置为/ dev/null不会停止输出。 – Cory 2012-08-02 13:59:04

+0

@Cory正是这个默认参数的值在函数定义的时候被设置了。看到[这个答案](http://stackoverflow.com/a/11416002/1142167)到一个(有点相关)的​​概念。 – 2012-08-02 17:44:02

相关问题