I tried some python modules and they did not satisfyed me. So I decided now to create my own little module to track KeyBoardInput with the help of c
. On Linux everything works fine but on Windows
the oder hand i have problems compiling the Code. I am using Python 3.11.1
and Windows 10
.
I get this Error Message:
gcc -shared -o custom_keyboard.pyd -I "C:/Program Files/Python311/include" -L"C:/Program Files/Python311/libs" -lpython311 custom_keyboard.c
In file included from C:/Program Files/Python311/include/Python.h:86:0,
from custom_keyboard.c:1:
C:/Program Files/Python311/include/cpython/pytime.h:184:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
struct timeval *tv,
^~~~~~~
C:/Program Files/Python311/include/cpython/pytime.h:190:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
struct timeval *tv,
^~~~~~~
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x15): undefined reference to `_imp__PyArg_ParseTuple'
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x4d): undefined reference to `_imp__Py_BuildValue'
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x6b): undefined reference to `_imp__PyModule_Create2'
collect2.exe: error: ld returned 1 exit status
And I used this piece of code:
#include <Python.h>
#ifdef _WIN32
// Windows specific includes
#include <conio.h>
#else
// Unix specific includes
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#endif
static PyObject *read_key(PyObject *self, PyObject *args)
{
if (!PyArg_ParseTuple(args, ""))
{
return NULL;
}
#ifdef _WIN32
// Windows implementation
int key = 0;
if (_kbhit())
{
key = _getch();
}
#else
// Unix implementation
struct termios old_tio, new_tio;
tcgetattr(STDIN_FILENO, &old_tio);
new_tio = old_tio;
new_tio.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
int key = 0;
char buf = 0;
ssize_t n;
if ((n = read(STDIN_FILENO, &buf, 1)) > 0)
{
key = buf;
}
tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
#endif
return Py_BuildValue("i", key);
}
static PyMethodDef keyboardMethods[] = {
{"read_key", read_key, METH_VARARGS, "Reads a single key from the keyboard."},
{NULL, NULL, 0, NULL}};
static struct PyModuleDef keyboardModule = {
PyModuleDef_HEAD_INIT,
"keyboard",
NULL,
-1,
keyboardMethods};
PyMODINIT_FUNC PyInit_custom_keyboard(void)
{
return PyModule_Create(&keyboardModule);
}
So I found this Thread but changing PyInit_custom_keyboard
to Pycustom_keyboard_Create
Didn't help.
Using the Developer Shell of Visual Studio with:
cl /LD /I"C:\Program Files\Python311\include" custom_keyboard.c /link /LIBPATH:"C:\Program Files\Python311\libs" /OUT:custom_keyboard.pyd
I get this Error:
C:\Program Files\Python311\libs\python311.lib: Warning LNK4272:Library computer type "x64" conflicts with target computer type "x86"
custom_keyboard.pyd : fatal error LNK1120: 3 unresolved externals
source https://stackoverflow.com/questions/76067814/cant-compile-c-code-on-windows-10-to-use-it-as-python-module
Comments
Post a Comment