Instalar el paquete con el directorio de origen separado en modo editable

Situación

Esta es la estructura de un paquete de ejemplo:

$ tree Foo/ Foo/ ├── setup.py └── src ├── bar.py └── __init__.py 

El nombre del paquete será foo sin embargo, los archivos fuente del paquete se colocan en la carpeta src .

Los contenidos de los archivos son:

setup.py:

 from setuptools import setup setup( name='foo', version='1', packages=['foo'], package_dir={'foo': 'src'} ) 

__init__.py:

 from .bar import bar print(bar) 

bar.py:

 bar = 1 

Problema

Al hacer la pip install Foo todo está bien y puedo usar el paquete como esperaba:

 >>> import foo 1 

Sin embargo, cuando instalo el paquete en modo editable ( pip install -e Foo ) no funciona:

 >>> import foo Traceback (most recent call last): File "", line 1, in  ImportError: No module named 'foo' 

En su lugar puedo importar src ahora:

 >>> import src 1 

La instalación con el site-packages/foo.egg-link -e creó un archivo site-packages/foo.egg-link con el siguiente contenido:

 /Foo . 

Se ha creado un directorio foo.egg-info correspondiente en Foo :

 $ tree Foo/foo.egg-info/ Foo/foo.egg-info/ ├── dependency_links.txt ├── PKG-INFO ├── SOURCES.txt └── top_level.txt 

El archivo SOURCES.txt contiene:

 $ cat Foo/foo.egg-info/PKG-INFO foo.egg-info/PKG-INFO foo.egg-info/SOURCES.txt foo.egg-info/dependency_links.txt foo.egg-info/top_level.txt src/__init__.py src/bar.py 

y el top_level.txt :

 $ cat Foo/foo.egg-info/top_level.txt foo 

Por lo tanto, durante la importación, Python parece ignorar la información que se presenta en Foo/foo.egg-info/ pero en su lugar, solo busca Foo/ busca de un paquete llamado foo (que no se encuentra).

Pregunta

¿Cómo puedo preparar un paquete que usa una carpeta de origen separada (cuyo nombre es diferente del nombre del paquete) para que pueda instalarlo en modo editable y seguir utilizándolo como se instaló normalmente? Trabajar en cualquier caso por ejemplo).

Creo que en la carpeta src debería haber una carpeta foo que contenga init .py y bar.py de esa manera el nombre del paquete será foo y usted puede importar el paquete foo. Sin embargo, no estoy seguro de por qué se comporta de manera diferente en el modo editable.