Фактически, запустив код из каталога package
, вы неправильно настроили Python.Вам не следовало помещать этот каталог в sys.path
, поскольку он находится внутри пакета.
Python не использует имя файла в качестве ключа, потому что он не импортирует файл, он импортирует модуль.Разрешение людям делать 'import c:\jim\my files\projects\code\stuff
' будет поощрять все виды злобности.
Вместо этого рассмотрите этот случай: что если бы вы были в ~/foo/package/
, а ~/bar
были на PYTHONPATH
- но ~ / barпросто символическая ссылка на ~/foo
?Ожидаете ли вы, что Python разрешит, а затем дедуплицирует символическую ссылку для вас?Что если вы поместите относительный каталог в PYTHONPATH, а затем измените каталоги?Что если 'foo.py' является символической ссылкой на 'bar.py'?Вы ожидаете, что оба из них будут также дублированы?Что если это не символические ссылки, а точные копии?Добавление сложных правил, чтобы попытаться сделать что-то удобное в неоднозначных обстоятельствах, означает, что это делает что-то очень неудобное для других людей.(Python zen 12: перед лицом неоднозначности откажитесь от соблазна догадаться.)
Python делает здесь что-то простое, и вы несете ответственность за правильную настройку среды.Теперь вы можете утверждать, что не очень хорошая идея ставить текущий каталог на PYTHONPATH
по умолчанию - я могу даже согласиться с вами - но, учитывая, что он есть, он должен следовать тому же непротиворечивому набору правил, что и другой путьЗаписи делают.Если он предназначен для запуска из произвольного каталога, ваше приложение всегда может удалить текущий каталог из sys.path
, начиная с sys.path.remove('')
.