2015-03-10 3 views
1

У меня есть эта структура каталогов:"Сайт" не является пакет

my_project/ 
    site/ 
     __init__.py 
     app.py 
    main.py 

main.py содержит следующее:

import site.app 
print('Success') 

Получить эту ошибку:

Traceback (most recent call last): 
    File "main.py", line 1, in <module> 
    import site.app 
ImportError: No module named 'site.app'; 'site' is not a package 

переименовании «сайт «для любого другого имени это работает правильно. Пример:

$ mv site/ foo/ 
$ echo -e "import foo.app\nprint('Success')" > main.py 
$ python main.py 
Success 
$ 

Является ли «сайт» специальным именем упаковки? Зачем? Как мне обойти это?

ответ

2

site является standard library module. Способ обойти это не назвать ваш пакет, который, как и вы не назовете его math или sys или itertools. Если вы хотите, чтобы пакет my_project был пакетом, сделайте его пакетом, сделайте его пакетом, указав его __init__.py. Вы не хотите создавать пакет верхнего уровня с именем site.

+0

Ах, конечно, как глупо. Но что, если я хочу назвать это так или иначе? – William

+0

@William: Вы могли бы обойти это, изменив порядок путей в вашем 'sys.path'. Однако вы действительно не должны этого делать. Никто другой не сможет использовать ваш модуль, не делая никаких хаков, которые вы сделали, чтобы заставить его работать. – BrenBarn

+0

Нет способа в Python 3 Я могу указать «относительный импорт» и сказать «из». import site.app' или что-то еще? (Я пробовал этот точный синтаксис, предложенный [pep 328] (https://www.python.org/dev/peps/pep-0328/). Давайте будем ясно, что я не спрашиваю о «лучшей практике», но «что возможно». Я знаю, что это нехорошо делать :) – William

Смежные вопросы