Use DLL-FUNCIÓN en Python con CTYPES | Python 2.7 vs. 3.6 -- python campo con dll campo con ctypes camp Relacionados El problema

Use dll-function in python with ctypes | python 2.7 vs. 3.6


2
vote

problema

Español

Tengo una biblioteca C ++ (example.dll) con algunas funciones y quiero usarlas de Python. Lo tengo trabajando con ctypes y Python 2.7, pero no con Python 3.6.

Aquí un extracto de ejemplo.H:

  extern "C" __declspec(dllexport) LONG _stdcall func1(LPTSTR filename, long cbAddress);   

La función está analizando un archivo TXT, carga algunos datos en la memoria y devuelve un asa a estos datos.

Mi código para Python 2.7 es:

  from ctypes import *  mydll = WinDLL(r'C: empexample.dll') txt_path = c_char_p(r'C: empfile.txt')  func1 = mydll['func1'] func1.restype = c_long func1.argtypes = (c_char_p , c_void_p) handle = func1(txt_path, None)   

Esto funciona y devuelve un asa válida.

con Python 3.6, la línea 3 causa un error:

  >>> txt_path = c_char_p(r'C: empfile.txt') Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: bytes or integer address expected instead of str instance   

así que lo cambié a

  txt_path = c_char_p(b'C: empfile.txt')   

que está funcionando, pero lleva a un problema con la función. func1 Devoluciones ahora 0, que es un código de error interno para "No se pudo leer el archivo TXT".

Intenté usar diferentes tipos, pero no funcionó y ahora estoy atascado.

¿Puede alguien ayudar?

Original en ingles

I have a C++-Library (example.dll) with some functions and want to use them from Python. I got it working with ctypes and Python 2.7, but not with Python 3.6.

Here an excerpt from example.h :

extern "C" __declspec(dllexport) LONG _stdcall func1(LPTSTR filename, long cbAddress); 

The function is parsing a txt-file, loads some data to the memory and returns a handle to this data.

My code for Python 2.7 is:

from ctypes import *  mydll = WinDLL(r'C:\temp\example.dll') txt_path = c_char_p(r'C:\temp\file.txt')  func1 = mydll['func1'] func1.restype = c_long func1.argtypes = (c_char_p , c_void_p) handle = func1(txt_path, None) 

This is working and returns a valid handle.

With Python 3.6, line 3 causes an error:

>>> txt_path = c_char_p(r'C:\temp\file.txt') Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: bytes or integer address expected instead of str instance 

so I changed it to

txt_path = c_char_p(b'C:\temp\file.txt') 

which is working, but leads to a problem with the function. func1 returns now 0, which is an intern error code for "could not read txt-file."

I tried to use different types, but it didn't work and I'm kind of stuck now.

Can anyone help?

        
     
     

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

El problema fue simplemente el escape de las barras invertidas (alguien con un punto de vista cínico podría decir que el problema es Windows), la línea en la pregunta txt_path = c_char_p(b'C: empfile.txt') tuvo que cambiar a:

  String loadData = "load data local infile 'table_data.txt'" +                       "into table T1;";   0  
 

The issue was simply the escaping of backslashes (someone with a cynical point of view might say the issue is Windows) the line in question txt_path = c_char_p(b'C:\temp\file.txt') had to be changed to:

txt_path = c_char_p(b'C:\\temp\\file.txt') 
 
 

Relacionados problema

5  Recibiendo wm_copydata en Python  ( Receiving wm copydata in python ) 
Estoy tratando de leer de Python El mensaje Message Algunas aplicaciones (estoy intentando con Spotify) Enviar a WindowsLivemessenger para actualizar la fras...

2  ¿Tipográficos difíciles en CTYPES POSIBLE? int -> "puntero a la estructura", por ejemplo,  ( Hard typecasts in ctypes possible int pointer to struct for example ) 
Tengo que estoy dentro de una devolución de llamada que me permite acceder a los punteros pasados ​​a él como Qué tal que tengo que hacer si quiero converti...

6  Evitar la conversión de tipo automático en las funciones de devolución de llamada de CTYPES  ( Prevent automatic type conversion in ctypes callback functions ) 
Al envolver Funciones de Python con una CFUNCTYPE tipo, he encontrado que los tipos no punteros se convierten automáticamente como su value Se llamó A...

4  ctypes Python y no suficientes argumentos (4 bytes que falta)  ( Python ctypes and not enough arguments 4 bytes missing ) 
La función que estoy tratando de llamada es: void FormatError (HRESULT hrError,PCHAR pszText); desde un archivo DLL personalizado utilizando WINDLL. ...

4  ¿Cómo construyo una matriz de estructuras CTYPE?  ( How do i construct an array of ctype structures ) 
GaData4 Estoy tratando de construir una matriz de estructuras C en Python y desea que el constructor se llame a cada elemento en la matriz. ¿Cómo puedo lo...

0  Cargue la biblioteca de densa de Cula en Python en Jetson TK1 Board  ( Load cula dense library into python on jetson tk1 board ) 
Habiendo descargado e instalado con éxito el paquete completo de Cula dense R18 desde este sitio web ( http: // www. Culatools.com/downloads/DENSE/ ) en My Je...

18  Python Import DLL  ( Python import dll ) 
¿Cómo importaría un Windll a Python y podré usar todas sus funciones? Solo necesita dobles y cuerdas. ...

0  ¿Cómo liberé mallocs anidados de una biblioteca C compartida en Python (CTYPES)?  ( How do i free nested mallocs from a c shared library in python ctypes ) 
Tengo este código C: test.c #define max_size 9 #define max_value 11 char ** my_function(char my_string[]){ char **my_array = malloc(sizeof(char *)...

1  Fallo de segmentación de Python usando PCAP a través de CTYPES  ( Python segmentation fault using pcap via ctypes ) 
Estoy portando de mi sniffer de C a Python usando LibpCap a través de cTYPES. Aquí está el código Python: A8 en Linux Funciona perfectamente bien, pero ...

2  Python ctypes pila de corrupción  ( Python ctypes stack corruption ) 
Tengo problemas extraños con los ctypes, donde, por lo que parece estar corrompiendo la pila por la deferencia de un puntero cuando no debería serlo. La confi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos