Когда у меня есть пакетный test
, я привык импортировать из него еще один script
файла:
import test.script
и библиотеки:
import library
Это работает до тех пор, пока мне не нужна библиотека, имя которой соответствует любому из моих сценариев. Когда это происходит, скрипт загружается, а не библиотека. Есть ли способ заставить локальный импорт использовать полный путь к файлу, когда я его использую? Или есть другой способ предотвратить столкновение имен, не переименовывая скрипт?
Когда вы называете "скрипт" с тем же именем, что и зависимость, вы перехватили поиск этого имени.
Вы можете изменить свой PYTHONPATH ie sys.path
, помещая ваши зависимости перед вашими "скриптами", но затем вы перехватили свои скрипты - это кажется очень плохой идеей.
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['', # Current Working Directory
'~\\Anaconda3\\python36.zip',
'~\\Anaconda3\\DLLs',
'~\\Anaconda3\\lib',
'~\\Anaconda3',
'~\\Anaconda3\\lib\\site-packages',
'~\\Anaconda3\\lib\\site-packages\\Sphinx-1.5.6-py3.6.egg',
'~\\Anaconda3\\lib\\site-packages\\win32',
'~\\Anaconda3\\lib\\site-packages\\win32\\lib',
'~\\Anaconda3\\lib\\site-packages\\Pythonwin',
'~\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg']
Не изменяйте порядок поиска в вашем sys.path
.
Я бы не назвал ни одного скрипта с тем же именем, что и зависимость, за единственным исключением, что я собирался перехватить имя с чем-то семантически одним и тем же.
Пространства имен - одна хорошая идея - пусть больше таких!
Вам нужно собственное пространство имен. Создайте каталог, например a_namespace
, поместите свои скрипты в этот каталог и работайте из родительского каталога. Например:
>>> from pathlib import Path
>>> Path('a_namespace').mkdir()
>>> (Path('a_namespace') / 'sys.py').write_text('print("importing my sys")')
25
>>> import a_namespace.sys
importing my sys
И вы все равно можете добраться до своих зависимостей:
>>> import sys
>>> sys.version
'3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]'