2017-01-16 6 views
1

いくつかの理由から、私はPythonのsslモジュールを拡張する必要があります。クリニック入力があった元の関数の前に :"クリニック"が使用されている場合、どのようにしてPythonモジュール用の新しい関数を作成できますか?

特に私はC.

に私の問題は、opensslのとは関係ありません)(load_cert_chainの第二のバージョンを必要とするのではなく、「診療所」に対処する方法

/*[clinic input] 
_ssl._SSLContext.load_cert_chain 
certfile: object 
keyfile: object = NULL 
password: object = NULL 

[clinic start generated code]*/ 

static PyObject * 
_ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, 
            PyObject *keyfile, PyObject *password) 
/*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/ 
{ 
    PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL; 
    pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback; 
    ... 

これまでのところ、私が知っている、_ssl__SSLContext_load_cert_chain_implはload_cert_chainの実装であり、_ssl.ch このヘッダファイル内で定義されて_ssl__SSLContext_load_cert_chain、内と呼ばれる、しかし、clinic-によって自動生成されるが、それではないこと?

したがって、私は新しい機能load_cert_chain2をオリジナルのコピーとして定義し始めます。すべてが自動作成されているからですか?

答えて

1

は、いくつかの誤解クリアするには:

ありませんが、引数クリニックは、Pythonの関数にC関数をリンクとは何の関係もありません!

引数クリニックは、C関数の関数シグネチャを作成するだけです。位置引数とNULLのデフォルトとkeyfile, passwordなどのオプションの引数としてcertfile:あなたの例

/*[clinic input] 
_ssl._SSLContext.load_cert_chain 
certfile: object 
keyfile: object = NULL 
password: object = NULL 

_ssl__SSLContext_load_cert_chain_impl C関数は、Python objectを期待して3つの引数を指定して_ssl._SSLContext.load_cert_chainとして署名に公開されます。


関数が呼び出される方法や時刻は、引数クリニックにリンクされていません。

#define _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF \ 
    {"load_cert_chain", (PyCFunction)_ssl__SSLContext_load_cert_chain, METH_FASTCALL, _ssl__SSLContext_load_cert_chain__doc__} 

static PyObject * 
_ssl__SSLContext_load_cert_chain(PySSLContext *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) 
{ 
    [...] 
    return_value = _ssl__SSLContext_load_cert_chain_impl(self, certfile, keyfile, password); 
} 

、明示的Modules/_ssl.c_SSLContextクラスにメソッドとして追加されます::メソッド宣言はModules/clinic/_ssl.c.hで行われ

static struct PyMethodDef context_methods[] = { 
    [...] 
    _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF 
    [...] 
    {NULL, NULL}  /* sentinel */ 
}; 

[...] 

static PyTypeObject PySSLContext_Type = { 
    PyVarObject_HEAD_INIT(NULL, 0) 
    "_ssl._SSLContext",      /*tp_name*/ 
    sizeof(PySSLContext),      /*tp_basicsize*/ 
    [...] 
    context_methods,       /*tp_methods*/ 
    [...] 
}; 

ので、引数のクリニックは、メソッドを割り当てるための責任を負いません。クラスにこれは、ラッパー関数_ssl__SSLContext_load_cert_chain_ssl__SSLContext_load_cert_chain_implとし、クラスに割り当てられたPyMethodDef構造体を使用してクラスに割り当てられています。

ここで、自動生成リンクがないことがわかりました。その機能を置き換えるときに役立つかどうかはわかりません。 Pythonを再コンパイルしたり、関連するすべてのファイルを拡張機能にコピーしたりすることなく、簡単に(引数クリニックまたはクリニックなしで)どのように行うことができるか分かりません。

+0

私はあなたが書いたことを知っています。しかし、load_cert_chain、load_cert_chain2のコピーを作成するには、_ssl.c.h内の関連する部分もコピーする必要がありますか?私はそれが間違った方法だと思う、hファイルが自動生成されるためです。 – michael

+0

実際、私はclin​​ic.pyもインストールしていません。私がしたのは、元のコードに従って_ssl.c.hを変更することでした。それは動作し、新しいメソッドはPythonインタプリタから呼び出すことができます。 – michael

+0

あなたは変更したいものを明確にすることができますか? – MSeifert

関連する問題