Search code examples
pythonc++tensorflowanacondazlib

C++ calls Python in Anaconda3 error: ModuleNotFoundError: No module named 'zlib'


I need to use the C++ code to call the Python code(which used TensorFlow), Python was installed by Anaconda3. But I found my code couldn't load the python code because the tensorflow module was not loaded successfully. The clear question is below.

My C++ code:

#include <iostream>
#include <python.h>

int main()
{
    Py_Initialize();
    PyRun_SimpleString("import tensorflow");
    Py_Finalize();
    std::cout << "Hello World!\n";
}

The output:

2021-08-03 00:23:24.264014: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library cudart64_110.dll
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\__init__.py", line 41, in <module>
    from tensorflow.python.tools import module_util as _module_util
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\__init__.py", line 46, in <module>
    from tensorflow.python import data
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\__init__.py", line 25, in <module>
    from tensorflow.python.data import experimental
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\experimental\__init__.py", line 134, in <module>
    from tensorflow.python.data.experimental.ops.readers import CsvDataset
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\data\experimental\ops\readers.py", line 23, in <module>
    import gzip
  File "C:\ProgramData\Anaconda3\lib\gzip.py", line 9, in <module>
    import zlib
ModuleNotFoundError: No module named 'zlib'
Hello World!

I used base conda env, it has zlib module, and I tested it in Python was OK:

(base) PS C:\windows\system32> python
Python 3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
2021-08-03 00:26:11.966844: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library cudart64_110.dll
>>>

Here is my machine configuration:

OS: Windows 10
IDE: VS 2019
Conda version: 4.10.3
Python version: 3.8.8
VS project configuration: 
    Additional Include Directories: C:\ProgramData\Anaconda3\include
    Additional Library Directories: C:\ProgramData\Anaconda3\libs
    Additional Dependencies: python38.lib

UPDATE: Environment variables

PYTHONHOME=C:\ProgramData\Anaconda3
PYTHONPATH is not set.
PATH=C:\ProgramData\Anaconda3;C:\ProgramData\Anaconda3\Scripts;C:\ProgramData\Anaconda3\condabin\;C:\ProgramData\Anaconda3\Library\bin;...
#include <iostream>
#include <python.h>

int main()
{
    Py_Initialize();
    PyRun_SimpleString("import os");
    PyRun_SimpleString("print(os.environ['PYTHONHOME']) ");
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("print(sys.path)");
    //PyRun_SimpleString("import tensorflow");
    Py_Finalize();
    std::cout << "Hello World!\n";
}

here is the output:

C:\ProgramData\Anaconda3
['C:\\Users\\dqs\\source\\repos\\test\\x64\\Release\\python38.zip', 'C:\\ProgramData\\Anaconda3\\DLLs', 'C:\\ProgramData\\Anaconda3\\lib', 'C:\\Users\\dqs\\source\\repos\\test\\x64\\Release', 'C:\\ProgramData\\Anaconda3', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\locket-0.2.1-py3.8.egg', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\Pythonwin']

Solution

  • to avoid confusion and as the reported error message is different to what usually in conflict between imported library and linked library is reported. I'm adding this answer to this particular question,(ModuleNotFoundError: No module named 'zlib')

    In this case dll library that is used to build executable and libraries that path environment variable is referring are different. to avoid this conflict remove any python dlls, headers and import libraries from the vcpkg install.

    vcpkg remove <pkg>
    

    here pkg is referring to python version that is installed in vcpkg.