Когда изменяется sys.path?
У меня возникли трудности с пониманием этого абзаца в официальном уроке:
После инициализации программы Python могут изменить
sys.path
, Каталог, содержащий выполняемый скрипт, помещается в начало пути поиска, перед стандартным путем к библиотеке. Это означает, что скрипты в этом каталоге будут загружены вместо модулей с одинаковыми именами в каталоге библиотеки. Это ошибка, если замена не предназначена. Смотрите раздел Стандартные модули для получения дополнительной информации.
Скажем, у меня есть следующий модуль, названный demo.py
:
if __name__ == '__main__':
import sys
print sys.path
Есть еще один модуль с именем sys.py
в текущем каталоге, содержащем только pass
, Я хочу использовать этот модуль для "тени" стандартных модулей.
На терминале я выполнил и получил
sunqingyaos-MacBook-Air:Documents sunqingyao$ python demo.py
['/Users/sunqingyao/Documents', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages']
Итак, мой вопрос: когда sys.path
модифицированный?
- Если он был изменен раньше
import sys
выполняется,sys.py
следует импортировать вместо стандартного модуля. - Если он изменен после
print sys.path
выполняется,'/Users/sunqingyao/Documents'
не должно происходить вsys.path
,
И также странно, что изменение произошло между выполнением import sys
а также print sys.path
,
1 ответ
sys
это встроенный модуль, он является частью интерпретатора и не может быть замаскирован, потому что он уже загружен при запуске интерпретатора.
Это потому что sys.modules
является основным реестром для загружаемых модулей, и sys.modules['sys']
указывает на себя. любой import sys
заявление найдет sys.modules['sys']
перед поиском пути к модулю.
sys
это не единственный встроенный модуль, хотя это единственный загружаемый модуль. Увидеть sys.builtin_module_names
кортеж для других модулей, которые скомпилированы в ваш двоичный файл Python.
Это ответственность site
модуль для обновления sys.path
; он загружается как часть процесса начальной загрузки Python, если вы не использовали -S
переключатель командной строки.