I am trying to make an executable from a setuptools distribution, I have the following structure: TEST-DIST ├── app.spec ├── my_package │ ├── __init__.py │ ├── __main__.py │ ├── script1.py │ └── script2.py └── setup.py Setup.py: from importlib.metadata import entry_points import setuptools setuptools.setup( name="testapp", version="0.0.1", author="Example Author", author_email="author@example.com", description="A small example package", url="https://github.com/pypa/sampleproject", project_urls={ "Bug Tracker": "https://github.com/pypa/sampleproject/issues", }, classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], entry_points={'console_scripts': ["mytestscript1=my_package.script1:main", "mytestscript2=my_package.script2:main"]}, python_requires=">=3.6" ) app.spec that uses this script to work with setuptools block_cipher = None def Entrypoint(dist, group, name, **kwargs): import pkg_resources # get toplevel packages of distribution from metadata def get_toplevel(dist): distribution = pkg_resources.get_distribution(dist) if distribution.has_metadata('top_level.txt'): return list(distribution.get_metadata('top_level.txt').split()) else: return [] kwargs.setdefault('hiddenimports', []) packages = [] for distribution in kwargs['hiddenimports']: packages += get_toplevel(distribution) kwargs.setdefault('pathex', []) # get the entry point ep = pkg_resources.get_entry_info(dist, group, name) # insert path of the egg at the verify front of the search path kwargs['pathex'] = [ep.dist.location] + kwargs['pathex'] # script name must not be a valid module name to avoid name clashes on import script_path = os.path.join(workpath, name + '-script.py') print("creating script for entry point", dist, group, name) with open(script_path, 'w') as fh: print("import", ep.module_name, file=fh) print("%s.%s()" % (ep.module_name, '.'.join(ep.attrs)), file=fh) for package in packages: print("import", package, file=fh) return Analysis( [script_path] + kwargs.get('scripts', []), **kwargs ) a = Entrypoint("testapp", 'console_scripts', 'mytestscript1') pyz = PYZ(a.pure, a.zipped_data) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='mytestscript1') I first build the package using python3 -m build, Then I execute pyinstaller pyinstaller app.spec, Which results the following error: 27 INFO: PyInstaller: 4.10 27 INFO: Python: 3.8.10 34 INFO: Platform: Linux-5.10.60.1-microsoft-standard-WSL2-x86_64-with-glibc2.29 35 INFO: UPX is not available. Traceback (most recent call last): File "/usr/local/bin/pyinstaller", line 8, in <module> sys.exit(run()) File "/home/admin/.local/lib/python3.8/site-packages/PyInstaller/__main__.py", line 124, in run run_build(pyi_config, spec_file, **vars(args)) File "/home/admin/.local/lib/python3.8/site-packages/PyInstaller/__main__.py", line 58, in run_build PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) File "/home/admin/.local/lib/python3.8/site-packages/PyInstaller/building/build_main.py", line 803, in main build(specfile, distpath, workpath, clean_build) File "/home/admin/.local/lib/python3.8/site-packages/PyInstaller/building/build_main.py", line 725, in build exec(code, spec_namespace) File "app.spec", line 42, in <module> a = Entrypoint("testapp", 'console_scripts', 'mytestscript1', datas=[('testapp.egg-info/*','testapp.egg-info')]) File "app.spec", line 25, in Entrypoint ep = pkg_resources.get_entry_info(dist, group, name) File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 500, in get_entry_info return get_distribution(dist).get_entry_info(group, name) File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 482, in get_distribution dist = get_provider(dist) File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 358, in get_provider return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 901, in require needed = self.resolve(parse_requirements(requirements)) File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 787, in resolve raise DistributionNotFound(req, requirers) pkg_resources.DistributionNotFound: The 'testapp' distribution was not found and is required by the application The exception is invoked because pkg_resources.get_entry_info doesn't find my distribution when it is executed from pyinstaller, but when I run it from any normal script in the root it can be found without problems: >>> import pkg_resources >>> pkg_resources.get_entry_info("testapp", 'console_scripts', 'mytestscript1') EntryPoint.parse('mytestscript1 = my_package.script1:main') None of the solutions here helped! Continue reading...