Calling Python macro from ctypes

Peter Otten __peter__ at web.de
Mon Aug 12 07:42:14 EDT 2013


Steven D'Aprano wrote:

> Is it possible to call a Python macro from ctypes? For example, Python
> 3.3 introduces some new macros for querying the internal representation
> of strings:
> 
> http://www.python.org/dev/peps/pep-0393/#new-api
> 
> 
> So I try this in 3.3:
> 
> py> import ctypes
> py> ctypes.pythonapi.PyUnicode_MAX_CHAR_VALUE
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/usr/local/lib/python3.3/ctypes/__init__.py", line 366, in
> __getattr__
>     func = self.__getitem__(name)
>   File "/usr/local/lib/python3.3/ctypes/__init__.py", line 371, in
> __getitem__
>     func = self._FuncPtr((name_or_ordinal, self))
> AttributeError: python3.3: undefined symbol: PyUnicode_MAX_CHAR_VALUE

That's not possible. It may look like a function, but a preprocessor 
replaces the C macro in the C source before compilation. An example of very 
bad usage of macros, just to drive the point home:

$ cat macro.c 
#define IF(expr) if (expr) {
#define ENDIF ;}

main()
{
  IF(1>0)
    printf("It worked\n")
  ENDIF
}

And here's what the compiler sees:

$ gcc -E -P macro.c



main()
{
  if (1>0) {
    printf("It worked\n")
  ;}
}





More information about the Python-list mailing list