我們正在將基於C++ openssl的項目轉換爲python w/M2Crypto,並且我們遇到了一個與M2Crypto的BIO例程有點不同的問題。具體而言,對BIO.readlines()的任何調用都會永久掛在文件對象上。M2Crypto BIO.readlines掛起,python 2.7
下面是什麼,我們嘗試了快速出樣:
f = open('test.txt','w')
f.write('hello world\n')
f.close()
import M2Crypto.BIO
bio = M2Crypto.BIO.openfile('test.txt','r')
lines = bio.readlines()
# the above call hangs forever
爲了確保我們沒有什麼可怕的錯誤與我們的OpenSSL安裝,我們創建一個小的測試程序來讀取test.txt文件我們只創建
#include <openssl/bio.h>
#include <openssl/err.h>
int main() {
const int maxrd = 4096;
char line[maxrd];
int rd;
BIO* bio = BIO_new_file("test.txt","r");
while((rd = BIO_gets(bio, line, maxrd)) > 0) {
printf("%s",line);
}
if (rd == -1) {
printf("BIO error %ld\n", ERR_get_error());
}
}
沒問題。
我們一直在研究M2Crypto-0.21.1/SWIG/_bio.i包裝文件,並認爲我們可能有問題的根源。 109線路測試從BIO_gets()的返回值
if (r < 0) {
// return Py_None
}
,但對於BIO_gets手冊頁()表明,它可能會返回0或-1表示結束流。
我相信它應該是
if (r < 1) {
// return Py_None
}
但想看看是否遇到過其他的 - 或者我們是否在我們的BIO_gets的理解()系統錯誤的。
--- ---詳細 Pythong 2.7 M2Crypto 0.21.1 OpenSSL的0.9.8q-FIPS 2010年12月2日 的FreeBSD 8.2-RELEASE-P4
順便說一句 - 我不知道開發商科瓦萊寧親自......但他的項目M2Crypto絕對是妙不可言。它不僅是Python/OpenSSL包裝器的特殊實現,而且是創建SWIG代碼的正確方法的一個例子 - 乾淨,簡單,通透等等......幹得好,先生。 – user590028 2012-02-15 15:18:32