You can use relative paths in package lookup configuration. Examples:
all distributed sources are in generated
from setuptools import setup, find_packages setup( ... package_dir={'': '../generated'}, packages=find_packages(where='../generated'), )
selected packages should be included from generated
In this example, only packages spam and eggs from generated will be included:
import pathlib from setuptools import setup, find_packages setup( name='so', package_dir={'spam': '../generated/spam', 'eggs': '../generated/eggs'}, packages=find_packages(where='../generated'), # or just ['spam', 'eggs'] )
Or implement a dynamic lookup like e.g.
package_dir={p.name: p.resolve() for p in pathlib.Path('..', 'generated').iterdir()}
better implementation by resolving all paths relative to the setup.py file
Resolving all paths relative to the setup.py script allows you to run the script from any other directory than src, e.g. you can run python src/setup.py bdist_wheel etc. You may or may not need it, depending on your use case. Nevertheless, the recipe is as usual: resolve all paths to __file__, e.g.
import pathlib from setuptools import setup, find_packages src_base = pathlib.Path(__file__, '..', '..', 'generated').resolve() setup( ... package_dir={'': str(src_base)}, packages=find_packages(where=src_base), )