Доступ к указателю во внутренней структуре объекта

Я использую интерфейс pyOpenSSL для библиотеки OpenSSL, но в нем отсутствуют некоторые функции, которые мне нужны, и я не могу или не хочу модифицировать его для поддержки этих методов (по разным причинам).

Итак, чего я хочу добиться, так это получить указатель объекта OpenSSL. После этого я смогу вызывать недостающие функции через ctypes. Каков наилучший способ сделать это?

Я уже обнаружил, что могу использовать id() для получения указателя на объект pyOpenSSL. Как я могу получить доступ к переменной ssl с помощью этого.

Из pyOpenSSL/connections.h:

  typedef struct {
      PyObject_HEAD
      SSL                 *ssl;
      ssl_ContextObj      *context;
      PyObject            *socket;
      PyThreadState       *tstate;
      PyObject            *app_data;
  } ssl_ConnectionObj;

person math    schedule 07.08.2009    source источник


Ответы (1)


Указатели не имеют особого смысла в Python, так как вы ничего не можете с ними сделать. Они будут просто целыми числами. Как вы заметили, вы можете получить адрес объекта с помощью метода id. Но это именно то, что есть, адрес. Это не указатель, поэтому вы ничего не можете с ним сделать.

Вы также можете увидеть это так: все в Python является указателем. Переменная, которую вы имеете для объекта pyOpenSSL, является указателем. Но это указатель на pyOpenSSL-объект, а не на структуру подключения. Маловероятно, что вы можете получить доступ к этой структуре напрямую.

Так что вы должны сказать нам, что вы хотите сделать вместо этого. Возможно, есть другое решение.

person Lennart Regebro    schedule 07.08.2009
comment
Я хочу использовать функцию SSL_set_verify, которая недоступна в pyOpenSSL (есть только set_verify в объекте контекста, а не в SSL-соединении), и я не хочу изменять pyOpenSSL (я хочу использовать тот, который упакован Ubuntu 8.04 LTS, который вряд ли будет изменен, даже если я внесу патч). - person math; 07.08.2009
comment
Как правило, вы не можете использовать функцию, которая не открыта. Возможно, вы сможете это сделать, если вообще не будете использовать pyOpenSSL и будете использовать только ctypes. Я не очень хорошо знаком с ctypes, но сомневаюсь, что вы сможете использовать его в миксе, так как вам будет сложно получить правильные дескрипторы от pyOpenSSL. Я думаю, что лучше всего отправить патч и установить pyOpenSSL из исходного кода. - person Lennart Regebro; 07.08.2009