C Python.ошибка импорта h API с OpenSSL

#c #python-3.x #api #module #openssl

#c #python-3.x #API #модуль #openssl

Вопрос:

Я тестирую Python API (python3) для C, создавая пример хэширования с использованием OpenSSL и MD5, но я получаю ошибку при попытке импортировать модуль в python3. Это мой исходный код на C:

  • hashmodule.c
 #include <stdlib.h>
#include <string.h>
#include <Python.h>
#include <openssl/md5.h>


unsigned char * __c_md5hash(const /*unsigned*/ char * string) {
    unsigned char * raw_hash = (unsigned char*)malloc(MD5_DIGEST_LENGTH);
    memset(raw_hash, '', MD5_DIGEST_LENGTH);

    MD5_CTX ctx;
    MD5_Init(amp;ctx);
    MD5_Update(amp;ctx, string, strlen(string));
    MD5_Final(raw_hash, amp;ctx);

    return raw_hash;
}

static PyObject * md5hash(PyObject * self, PyObject * args) {;
    const /*unsigned*/ char * string;

    if (!PyArg_ParseTuple(args, "s", amp;string))
        return NULL;

    return Py_BuildValue("s", __c_md5hash(string));
}

static PyMethodDef hashmethods[] = {
    {"md5hash", md5hash, METH_VARARGS, NULL},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef hashmodule = {
    PyModuleDef_HEAD_INIT,
    "hashmodule",
    "a simple test hashing module for python3",
    -1,
    hashmethods
};

PyMODINIT_FUNC PyInit_testmodule(void) {
    return PyModule_Create(amp;hashmodule);
}
  

Это мой скрипт настройки python3

  • setup.py
 from distutils.core import setup, Extension
import sysconfig

setup(
    name="hashmodule",
    version="1.0",
    ext_modules=[
        Extension(
            "hashmodule",
            sources=["hashmodule.c"],
            extra_compile_args=["-lcrypto", "-lssl"]
        )
    ]
)
  

Как показано в setup.py файле, я добавил флаги -lssl и -lcrypto для openssl, и компиляция build amp; install выполняется нормально при запуске python3 setup.py build и python3 setup.py install . Вот результат:

  • python3 setup.py build
 running build                                                                                                       
running build_ext                                                                                                   
building 'hashmodule' extension                                                                                     
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-s
trong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -
Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.8 -c hashmodule.c -o build/temp.linux-x86_64-3.8/hashmod
ule.o -lcrypto -lssl                                      
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 -Wl,-z,relro -g -
fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.l
inux-x86_64-3.8/hashmodule.o -o build/lib.linux-x86_64-3.8/hashmodule.cpython-38-x86_64-linux-gnu.so
  
  • python3 setup.py install
 running install                                           
running build                                                                                                       
running build_ext                                                                                                   
running install_lib                                                                                                 
copying build/lib.linux-x86_64-3.8/hashmodule.cpython-38-x86_64-linux-gnu.so -> /usr/local/lib/python3.8/dist-packag
es                                                                                                                  
running install_egg_info                                  
Writing /usr/local/lib/python3.8/dist-packages/hashmodule-1.0.egg-info
  

Как показано в сборке, она включает правильные флаги шифрования и ssl, необходимые для обычных компиляций с openssl. Однако, когда я затем захожу в python3 и выполняю следующее, появляется эта ошибка:

  • python3
 >>> import hashmodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python3.8/dist-packages/hashmodule.cpython-38-x86_64-linux-gnu.so: undefined symbol: MD5_Final
>>>
  

Я запустил nm , чтобы выяснить, были ли функции MD5 включены в модуль, который показывает следующее:

  • nm -S /usr/local/lib/python3.8/dist-packages/hashmodule.cpython-38-x86_64-linux-gnu.so | grep MD5
                  U MD5_Final
                 U MD5_Init
                 U MD5_Update
  

Я был бы очень признателен за любую помощь, и если я что-то пропустил, пожалуйста, дайте мне знать.

Большое спасибо!

Ответ №1:

Через несколько дней мне удалось найти обходной / альтернативный способ сборки модуля без использования setup.py и по-прежнему использовать его в python3

gcc -fPIC -shared hashmodule.c -o hashmodule.so -I /usr/include/python3.8 -lcrypto

и модуль работает нормально.

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

Редактировать:

Также только что нашел setup.py Аргумент расширения с именем «extra_link_args»

добавьте его в свои distutils.core.Extension() параметры и скомпилируйте как обычно с помощью python3 setup.py build amp; python3 setup.py install