Search code examples
pythonpython-3.xpyinstallergrpccx-freeze

make grpc python code to exe with cx_Freeze : No module named 'pkg_resources'


I’m making grpc server with python. My goal is to build an executable using cx_Freeze.

After I make greeter_server.exe using cx_Freeze, when I run greeter_server.exe, I meet this error.

Traceback (most recent call last):  
File “greeter_server.py", line 19, in <module>   
File “c:\users\User\anaconda3\envs\tensorflow\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module     exec(bytecode, module.__dict__)   
File “site-packages\grpc\__init__.py", line 22, in <module>  
File “src\python\grpcio\grpc\_cython\cygrpc.pyx", line 18, in init grpc._cython.cygrpc 
ModuleNotFoundError: No module named ‘pkg_resources'

My setup.py is like this.

import sys
from cx_Freeze import setup, Executable

build_exe_options = {}

setup(
    name='py freeze test',
    version='0.0.1',
    description="greeter_server function test",
    author="ray",
    options={'build_exe':build_exe_options},
    executables=[Executable("greeter_server.py")],
)

I tried a lot of tries.

pip install grp pip install grpcio pip install grpcio-tools

pip install --upgrade setuptools pip install --upgrade distribute

But when I tried pip install —upgrade distribute I meet this error.

Collecting distribute
  Using cached https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\setuptools\__init__.py", line 2, in <module>
        from setuptools.extension import Extension, Library
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\setuptools\extension.py", line 5, in <module>
        from setuptools.dist import _get_unpatched
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\setuptools\dist.py", line 7, in <module>
        from setuptools.command.install import install
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\setuptools\command\__init__.py", line 8, in <module>
        from setuptools.command import install_scripts
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\setuptools\command\install_scripts.py", line 3, in <module>
        from pkg_resources import Distribution, PathMetadata, ensure_directory
      File "C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\pkg_resources.py", line 1518, in <module>
        register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
    AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\User\AppData\Local\Temp\pip-install-ao7m4k8f\distribute\

I’m using Anaconda3-5.2.0, Python 3.6.7. (Because I have to use tensorflow)

Any help will be appreciated.


Solution

  • pkg_resources needs to be added to the packages list of the build_exe options:

    build_exe_options = {'packages': ['pkg_resources']}
    

    Remark: other entries might be necessary in the packages list in order that the setup script works (these entries are found in the OP's own answer but are missing in the setup script of the question).