Pasar una lista de cadenas de python/ctypes a la función C esperando char **
⏰ 3 minutos de lectura
joakim hove
Tengo una función C que espera una lista de cadenas terminadas en 0 como entrada:
void external_C( int length , const char ** string_list) {
// Inspect the content of string_list - but not modify it.
}
Desde python (con ctypes) me gustaría llamar a esta función en función de una lista de cadenas de python:
def call_c( string_list ):
lib.external_C( ?? )
call_c( ["String1" , "String2" , "The last string"])
¿Algún consejo sobre cómo construir la estructura de datos en el lado de Python? Observe que le garantizo que la función C NO alterará el contenido de las cadenas en string_list.
Saludos
joaquín
¿Cómo sabe la función C que ha llegado al final de la secuencia de const char *?
– habito
16 de agosto de 2010 a las 15:26
Bien; en general no sabe por supuesto. Mi intención era terminarlo con un NULL, alternativamente, puedo pasar una longitud y el puntero (char **): tengo control total sobre la biblioteca C en cuestión. Joaquín
– Joakim Hove
16 de agosto de 2010 a las 15:32
Si no lo sabe, es bastante inútil. Necesitas contarlo de alguna manera, y contar a nosotros para que podamos darle un código que funcione.
– habito
16 de agosto de 2010 a las 15:32
BIEN BIEN; No pensé que eso fuera tan importante. De todos modos, ahora he cambiado la definición de la función C para que tome un argumento de longitud como primer argumento.
– Joakim Hove
16 de agosto de 2010 a las 15:43
Lo siento, ¿cuáles deberían ser los tipos de argumentos para external_C?
Tenga en cuenta que en Python 3.x, las cadenas son Unicode de forma predeterminada, por lo que debe convertir sus cadenas en bytes a través de s.encode('utf-8') o bytes(s, 'utf-8') (o cualquier codificación que desee usar que no sea UTF-8).
– corwin.ámbar
24 de diciembre de 2018 a las 15:55
Sería bueno incorporar este ^ en la respuesta
– ben26941
20 de enero de 2020 a las 15:52
usuario422005
Muchísimas gracias; eso funcionó a las mil maravillas. También hice una variación alternativa como esta:
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
¿Cómo sabe la función C que ha llegado al final de la secuencia de
const char *
?– habito
16 de agosto de 2010 a las 15:26
Bien; en general no sabe por supuesto. Mi intención era terminarlo con un NULL, alternativamente, puedo pasar una longitud y el puntero (char **): tengo control total sobre la biblioteca C en cuestión. Joaquín
– Joakim Hove
16 de agosto de 2010 a las 15:32
Si no lo sabe, es bastante inútil. Necesitas contarlo de alguna manera, y contar a nosotros para que podamos darle un código que funcione.
– habito
16 de agosto de 2010 a las 15:32
BIEN BIEN; No pensé que eso fuera tan importante. De todos modos, ahora he cambiado la definición de la función C para que tome un argumento de longitud como primer argumento.
– Joakim Hove
16 de agosto de 2010 a las 15:43
Lo siento, ¿cuáles deberían ser los tipos de argumentos para external_C?
– mm_
1 de diciembre de 2020 a las 23:38