Все, что вы описываете, просто прекрасно и не воспроизводит ошибку - вот самая простая версия, которую я могу придумать:
$ mkdir /tmp/path
$ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2
$ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py
$ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py
$ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py
$ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2'
и работает нормально. __all__
не имеют значения, если вы не используете from ... import *
, который вы не используете (и вы не правы). Пока родительский каталог top
(здесь /tmp/path
) находится на sys.path
, все будет хорошо; если этого родительского каталога нет, вы получите ошибку.
Итак, какое минимальное изменение вы можете внести в эту последовательность операций, чтобы воспроизвести ошибку, которую вы заметили?