0

I'm trying to call cythonized python code from a C++ main. When python code includes an import line, the runtime fails due to not finding the imported package.

The simplified example below includes 6 files:

  • quacker.py - a file that is cytonized to pyd format (which is a windows dll)
  • setup.py - the file used for cytonizing quacker.py - i.e. converting it to a pyd file.
  • caller.pyx - a file the is converted to a header and a cpp file that is compiled and linked in the c++ application.
  • main.cpp - the main file of the C++ application
  • Quack.vcxproj - The Visual-Studio-2019 project file of the application
  • main.py - python file with which the cythonized file runs OK.

The file quacker.py

import jpeg
def quack():
    print("\n\n##############  Quack! ###############\n\n")

this file is cytonized by running the following command:

python setup.py build_ext --force --inplace

with the following setup.py file:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('quacker.py' , compiler_directives={'language_level' : "3"}))

the caller.pyx file is:

from quacker import quack
cdef public void call_quack():
    quack()

This file is converted to a cpp and h files using the command:

cython --cplus caller.pyx -3

and finally the C++ application main file main.cpp:

#ifdef _DEBUG
  #undef _DEBUG
  #include <python.h>
  #define _DEBUG
#else
  #include <python.h>
#endif
#include "caller.h"
int main()
{
    int status = PyImport_AppendInittab("caller", PyInit_caller);
    Py_Initialize();
    PyObject* module = PyImport_ImportModule("caller");
    call_quack();
    Py_Finalize();
    return 0;
}

running the compiled C++ application results with the following errors:

Traceback (most recent call last): File "caller.pyx", line 1, in init caller from quacker import quack File "quacker.py", line 2, in init quacker def quack(): ModuleNotFoundError: No module named 'jpeg' Exception ignored in: 'caller.call_quack' Traceback (most recent call last):
File "caller.pyx", line 1, in init caller from quacker import quack File "quacker.py", line 2, in init quacker def quack(): ModuleNotFoundError: No module named 'jpeg'

Running the quacker.*.pyd from the following main.py python script results with a successful execution.

from quacker import quack
quack()

So does running it from the C++ application after removing the importing of jpeg from quacker.py.

So how can I run cytonized files that import libreries from a C++ application?

thanks

Sadeh
  • 1
  • 1
    Possible duplicate of [ImportError after cython embed](https://stackoverflow.com/questions/56857449/importerror-after-cython-embed) – ead Nov 18 '19 at 05:56
  • Python doesn't find your site-packages, probably the easiest is to add the right path to `sys.path`. – ead Nov 18 '19 at 06:10
  • @ead I think this is the right duplicate, but I wonder if it's worth re-arranging your answer slightly: it seems to just straight into details about `venv` when I think the information you want to read first is "The problem is, that the (embeded) Python-interpreter...". I think tweaking it a bit would make it a better canonical answer (rather than an answer to the exact question) – DavidW Nov 18 '19 at 15:29

0 Answers0