0

I have a Python program that I would like to call from a C program. I have been told there is a way to create a C library from my Python Code using Cython.

I am new to Cython, and I don't really understand how it works. So far, I have Cython installed on my Linux machine and I have placed my Python program in the Cython-0.22.1 folder.

Here is what I have tried so far.

  1. I renamed my module.py file to a module.pyx file.
  2. I modified my setup.py file in the Cython folder so that it looks like this:

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(name = 'First try', ext_modules = cythonize("module.pyx"),)
    
  3. I ran this command in the shell: cython module.pyx. This created a module.c file in the same folder.

  4. I tried to run gcc module.c, however, I got error: Python.h no such file or directory. So I performed a locate Python.h and chose a file location, so I ran this instead: gcc -I /root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/ module.c
  5. However, this only showed me a bunch of unresolved parameter errors.
  6. I also followed this advice and tried additional flags: gcc -fPIC -c -I /root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include module.c, but that did not solve my parameter issue either.

So I have been stuck here with a bunch of unresolved parameters. Here is a snippet of what these errors look like:

/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/memoryobject.h:6
8: error: declaration for parameter ‘PyMemoryViewObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/stringobject.h:4
9: error: declaration for parameter ‘PyStringObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/complexobject.h:
43: error: declaration for parameter ‘PyComplexObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/complexobject.h:
12: error: declaration for parameter ‘Py_complex’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/floatobject.h:17
: error: declaration for parameter ‘PyFloatObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/longobject.h:10:
 error: parameter ‘PyLongObject’ has incomplete type
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/longobject.h:10:
 error: declaration for parameter ‘PyLongObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/intobject.h:26:
error: declaration for parameter ‘PyIntObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/unicodeobject.h:
423: error: declaration for parameter ‘PyUnicodeObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/unicodeobject.h:
137: error: declaration for parameter ‘Py_UNICODE’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/unicodeobject.h:
128: error: declaration for parameter ‘Py_UCS4’ but no such parameter
/usr/include/wchar.h:824: error: declaration for parameter ‘wcsftime’ but no suc
h parameter
/usr/include/wchar.h:756: error: declaration for parameter ‘ungetwc’ but no such
 parameter
/usr/include/wchar.h:749: error: declaration for parameter ‘fputws’ but no such
parameter
/usr/include/wchar.h:742: error: declaration for parameter ‘fgetws’ but no such
parameter
/usr/include/wchar.h:733: error: declaration for parameter ‘putwchar’ but no suc
h parameter
/usr/include/wchar.h:727: error: declaration for parameter ‘putwc’ but no such p
arameter
/usr/include/wchar.h:726: error: declaration for parameter ‘fputwc’ but no such
parameter
/usr/include/wchar.h:719: error: declaration for parameter ‘getwchar’ but no suc
h parameter
/usr/include/wchar.h:713: error: declaration for parameter ‘getwc’ but no such p
arameter
/usr/include/wchar.h:712: error: declaration for parameter ‘fgetwc’ but no such
parameter
/usr/include/wchar.h:510: error: declaration for parameter ‘__wcstold_internal’
but no such parameter
/usr/include/wchar.h:507: error: declaration for parameter ‘__wcstof_internal’ b
ut no such parameter
/usr/include/wchar.h:504: error: declaration for parameter ‘__wcstod_internal’ b
ut no such parameter
/usr/include/wchar.h:414: error: declaration for parameter ‘wcstoul’ but no such
 parameter
/usr/include/wchar.h:408: error: declaration for parameter ‘wcstol’ but no such
parameter
/usr/include/wchar.h:394: error: declaration for parameter ‘wcstod’ but no such
parameter
/usr/include/wchar.h:359: error: declaration for parameter ‘wcsrtombs’ but no su
ch parameter
/usr/include/wchar.h:353: error: declaration for parameter ‘mbsrtowcs’ but no su
ch parameter
/usr/include/wchar.h:318: error: declaration for parameter ‘mbrlen’ but no such
parameter
/usr/include/wchar.h:316: error: declaration for parameter ‘__mbrlen’ but no suc
h parameter
/usr/include/wchar.h:312: error: declaration for parameter ‘wcrtomb’ but no such
 parameter
/usr/include/wchar.h:308: error: declaration for parameter ‘mbrtowc’ but no such
 parameter
/usr/include/wchar.h:298: error: declaration for parameter ‘wctob’ but no such p
arameter
/usr/include/wchar.h:294: error: declaration for parameter ‘btowc’ but no such p
arameter
/usr/include/wchar.h:279: error: declaration for parameter ‘wmemset’ but no such
 parameter
/usr/include/wchar.h:276: error: declaration for parameter ‘wmemmove’ but no suc
h parameter
/usr/include/wchar.h:271: error: declaration for parameter ‘wmemcpy’ but no such
 parameter
/usr/include/wchar.h:267: error: declaration for parameter ‘wmemcmp’ but no such
 parameter
/usr/include/wchar.h:262: error: declaration for parameter ‘wmemchr’ but no such
 parameter
/usr/include/wchar.h:243: error: declaration for parameter ‘wcslen’ but no such
parameter
/usr/include/wchar.h:240: error: declaration for parameter ‘wcstok’ but no such
parameter
/usr/include/wchar.h:235: error: declaration for parameter ‘wcsstr’ but no such
parameter
/usr/include/wchar.h:232: error: declaration for parameter ‘wcspbrk’ but no such
 parameter
/usr/include/wchar.h:229: error: declaration for parameter ‘wcsspn’ but no such
parameter
/usr/include/wchar.h:225: error: declaration for parameter ‘wcscspn’ but no such
 parameter
/usr/include/wchar.h:211: error: declaration for parameter ‘wcsrchr’ but no such
 parameter
/usr/include/wchar.h:208: error: declaration for parameter ‘wcschr’ but no such
parameter
/usr/include/wchar.h:183: error: declaration for parameter ‘wcsxfrm’ but no such
 parameter
/usr/include/wchar.h:178: error: declaration for parameter ‘wcscoll’ but no such
 parameter
/usr/include/wchar.h:153: error: declaration for parameter ‘wcsncmp’ but no such
 parameter
/usr/include/wchar.h:150: error: declaration for parameter ‘wcscmp’ but no such
parameter
/usr/include/wchar.h:146: error: declaration for parameter ‘wcsncat’ but no such
 parameter
/usr/include/wchar.h:142: error: declaration for parameter ‘wcscat’ but no such
parameter
/usr/include/wchar.h:138: error: declaration for parameter ‘wcsncpy’ but no such
 parameter
/usr/include/wchar.h:134: error: declaration for parameter ‘wcscpy’ but no such
parameter
/usr/include/wchar.h:95: error: declaration for parameter ‘mbstate_t’ but no suc
h parameter
/usr/include/ctype.h:151: error: declaration for parameter ‘_tolower’ but no suc
h parameter
/usr/include/ctype.h:150: error: declaration for parameter ‘_toupper’ but no suc
h parameter
/usr/include/ctype.h:146: error: declaration for parameter ‘toascii’ but no such
 parameter
/usr/include/ctype.h:142: error: declaration for parameter ‘isascii’ but no such
 parameter
/usr/include/ctype.h:119: error: declaration for parameter ‘toupper’ but no such
 parameter
/usr/include/ctype.h:116: error: declaration for parameter ‘tolower’ but no such
 parameter
/usr/include/ctype.h:112: error: declaration for parameter ‘isxdigit’ but no suc
h parameter
/usr/include/ctype.h:111: error: declaration for parameter ‘isupper’ but no such
 parameter
/usr/include/ctype.h:110: error: declaration for parameter ‘isspace’ but no such
 parameter
/usr/include/ctype.h:109: error: declaration for parameter ‘ispunct’ but no such
 parameter
/usr/include/ctype.h:108: error: declaration for parameter ‘isprint’ but no such
 parameter
/usr/include/ctype.h:107: error: declaration for parameter ‘isgraph’ but no such
 parameter
/usr/include/ctype.h:106: error: declaration for parameter ‘islower’ but no such
 parameter
/usr/include/ctype.h:105: error: declaration for parameter ‘isdigit’ but no such
 parameter
/usr/include/ctype.h:104: error: declaration for parameter ‘iscntrl’ but no such
 parameter
/usr/include/ctype.h:103: error: declaration for parameter ‘isalpha’ but no such
 parameter
/usr/include/ctype.h:102: error: declaration for parameter ‘isalnum’ but no such
 parameter
/usr/include/ctype.h:86: error: declaration for parameter ‘__ctype_toupper_loc’
but no such parameter
/usr/include/ctype.h:84: error: declaration for parameter ‘__ctype_tolower_loc’
but no such parameter
/usr/include/ctype.h:82: error: declaration for parameter ‘__ctype_b_loc’ but no
 such parameter
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stdarg.h:105: error: declaration
for parameter ‘va_list’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/objimpl.h:259: e
rror: declaration for parameter ‘PyGC_Head’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:523: er
ror: declaration for parameter ‘_Py_HashSecret_t’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:429: er
ror: declaration for parameter ‘PyHeapTypeObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:411: er
ror: declaration for parameter ‘PyTypeObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:305: er
ror: declaration for parameter ‘freefunc’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:302: er
ror: declaration for parameter ‘PyBufferProcs’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:293: er
ror: declaration for parameter ‘PyMappingMethods’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:287: er
ror: declaration for parameter ‘PySequenceMethods’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:273: er
ror: declaration for parameter ‘PyNumberMethods’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:179: er
ror: declaration for parameter ‘Py_buffer’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:112: er
ror: declaration for parameter ‘PyVarObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/object.h:108: er
ror: declaration for parameter ‘PyObject’ but no such parameter
/root/Asta/nastassiasaidakcython/Cython-0.22.1/Python27/include/pymem.h:52: erro
r: declaration for parameter ‘PyMem_Malloc’ but no such parameter
module.c:10286: error: expected ‘{’ at end of input

Am I on the right track, or are these errors an indication of a more serious problem which tells me that I need to find a different approach?

Iharob Al Asimi
  • 52,653
  • 6
  • 59
  • 97

1 Answers1

2

How can I make a standalone binary from a Python program using cython?

You probably want a recipe something like this:

PYVERSION=2.7
foobar: foobar.py
    cython --embed foobar.py -o foobar.c
    $(CC) -I /usr/include/python$(PYVERSION) foobar.c -lpython$(PYVERSION) -o foobar

The magic is the --embed option, which embeds a copy of the Python interpreter main in the generated C. You'll want to change 'foobar' to reflect the name of your script, of course, and PYVERSION as appropriate.

You probably do not need --embed to get started since you are trying to make a library, but you do need that -lpython argument to tell it which shared library to link against.

Iharob Al Asimi
  • 52,653
  • 6
  • 59
  • 97
MK.
  • 33,605
  • 18
  • 74
  • 111