エラーメッセージ「in method 'bio_new_file', argument 1 of type 'char const *'」

pythonでpassbookを作成する処理を書いてたらM2Cryptoの内部でこのようなエラーがでた

in method 'bio_new_file', argument 1 of type 'char const *'

このままググったら検索結果が6件しかなかったので、一応メモしておく



追っかけてみるとエラーになるのはSMIME.load_keyでEVP.load_keyを読んでる箇所でエラーになっている

class SMIME:
    def load_key(self, keyfile, certfile=None, callback=util.passphrase_callback):
        if certfile is None:
            certfile = keyfile
        self.pkey = EVP.load_key(keyfile, callback) # => ここでエラー
        self.x509 = X509.load_cert(certfile)


さらに追いかけるとbio = m2.bio_new_file(file, 'r')の部分でエラーになることがわかった
ここでのfileは鍵のファイルパスである

def load_key(file, callback=util.passphrase_callback):
    """
    Load an M2Crypto.EVP.PKey from file.

    @type file: string
    @param file: Name of file containing the key in PEM format.

    @type callback: Python callable
    @param callback: A Python callable object that is invoked
    to acquire a passphrase with which to protect the key.

    @rtype: M2Crypto.EVP.PKey
    @return: M2Crypto.EVP.PKey object.
    """
    bio = m2.bio_new_file(file, 'r')  # ここでerror
    if bio is None:
        raise BIO.BIOError(Err.get_error())
    cptr = m2.pkey_read_pem(bio, callback)
    m2.bio_free(bio)
    if cptr is None:
        raise EVPError(Err.get_error())
    return PKey(cptr, 1)


結論を書いてしまうと、fileがunicord型だと上記のエラーになるのである。
str型で渡せば正常に処理できるようになった。