Вы можете создать простую оболочку C strtod
:
#include <stdlib.h>
double strtod_wrap(const char *nptr, char **endptr)
{
return strtod(nptr, endptr);
}
скомпилировать с:
gcc -fPIC -shared -o libstrtod.dll strtod.c
(если вы используете 64-битную версию Python, компилятор также должен быть 64-битной)
и вызовите его, используя ctypes
из python (linux: измените .dll
на .so
в целевой библиотеке lib и в приведенном ниже коде, это было протестировано в Windows):
import ctypes
_strtod = ctypes.CDLL('libstrtod.dll')
_strtod.strtod_wrap.argtypes = (ctypes.c_char_p, ctypes.POINTER(ctypes.c_char_p))
_strtod.strtod_wrap.restype = ctypes.c_double
def strtod(s):
p = ctypes.c_char_p(0)
s = ctypes.create_string_buffer(s.encode('utf-8'))
result = _strtod.strtod_wrap(s, ctypes.byref(p))
return result,ctypes.string_at(p)
print(strtod("12.5hello"))
печать:
(12.5, b'hello')
(это не так сложно, как кажется, так как я научился это делать всего 10 минут назад)
Полезные вопросы и ответы о ctypes