Когда изменяется 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 переключатель командной строки.

Другие вопросы по тегам