Calling Python macro from ctypes

Dave Angel davea at davea.name
Mon Aug 12 13:11:30 EDT 2013


Peter Otten wrote:

> 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")
>   ;}
> }
>

To elaborate a bit more, Python can only see those symbols that are put
into the shared library  They can be functions, and they can be
"values," but they don't include macros, which are processed by the
preprocessor, before the real C compiler even starts.  C Macros are
actually text-substitution rules.  They can look like functions, but
those functions do not end up in the shared library.

In Windows, you can use dumpbin to examine a DLL and see what symbols it
exports.  I don't remember the syntax; it's been years.

I assume there's a similar tool for Linux to examine a shared library
(typically an .so file).  Perhaps "readelf" and/or "nm" is such a tool,
but I don't really know. Although I've been using Python and C++ in
Linux in recent years, I haven't used them together, and neither have
I had to examine a shared library.

The following link looks interesting, but I haven't read it yet.

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

-- 
DaveA





More information about the Python-list mailing list