2012-08-01 54 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

相關問題