2011-02-24 4 views
1

Je veux passer une liste de chaînes python à une fonction C en attendant constchar **. J'ai vu la question et la solution here mais cela ne semble pas fonctionner pour moi. Le code exemple suivant:Ctypes Python: passage à la fonction avec l'argument 'const char **'

argList = ['abc','def'] 
options = (ctypes.c_char_p * len(argList))() 
options[:] = argList 

donne l'erreur suivante:

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
TypeError: string or integer address expected instead of str instance 

Qu'est-ce que je fais mal?


Addendum:

Il semble y avoir un consensus, que ce code devrait fonctionner. Voici comment reproduire le problème.

Les quatre lignes suivantes tapées dans ma ligne de commande Python illustrent mon problème.

Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> argList = ['abc', 'def'] 
>>> options = (c_char_p * len(argList))() 
>>> options[:] = argList 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string or integer address expected instead of str instance 
>>> 
+2

Où est l'erreur? Ce code semble fonctionner. –

+0

Sur ma machine ce n'est pas le cas. Quel système utilisez-vous? J'utilise Python 3.2 sur WinXP. - Cela pourrait-il faire une différence? – ARF

+0

Essayez 'argList = [b'abc ', b'def']'. –

Répondre

1

L'exemple de code python est correct.

Pouvez-vous coller l'intégralité du code?

Dans ce cas, je devine que votre chaîne contient des octets NUL incorporés, et lève cette exception TypeError.

Hope this lien aide: http://docs.python.org/c-api/arg.html

+0

Voir l'addition à ma question sur la façon de reproduire le problème. – ARF

+0

Peut-être que c'est un bug prêt pour cette verion python. – Xirui

+0

J'utilise Python 3.1.2 (release31-maint, 17 septembre 2010, 20:34:23) [GCC 4.4.5] sur linux2. J'ai tapé le même code, il ne donne aucun message d'erreur. Essayez le code en utilisant une version plus ancienne. – Xirui

3

Une autre syntaxe à considérer:

>>> from ctypes import * 
>>> a = 'abc def ghi'.split() 
>>> b=(c_char_p * len(a))(*a) 
>>> b[0] 
'abc' 
>>> b[1] 
'def' 
>>> b[2] 
'ghi' 

Travaux sur mon 2.7.1 et 3.1.3 installation. Fonctionne sur 3.2 si le tableau est une instance d'octets, et non par exemple str:

Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> a = b'abc def ghi'.split() 
>>> b=(c_char_p * len(a))(*a) 
>>> b[0] 
b'abc' 
>>> b[1] 
b'def' 
>>> b[2] 
b'ghi' 

Ressemble pré-3.2 permet la contrainte de str (Unicode) en octets. Ce n'est probablement pas un bug, puisque la série 3.X a essayé d'éliminer la conversion automatique des octets < -> str (explicite est mieux que implicite).