Почему PyCharm всегда добавляет "контентный корень" в мой PYTHONPATH и что PYTHONPATH?

Я смущен тем, как PyCharm определяет путь, который использует Python для поиска модулей и пакетов.

Прежде всего, когда я сниму настройки (как в "Консоли Python", так и в моей конфигурации запуска), я все еще вижу каталог для моего проекта в начале sys.path.

Например, у меня есть проект в 'path problem' и 'Run' файл, содержащий

import sys
for p in sys.path:
    print p

Я получаю

/Users/Rax/Documents/Projects/pathproblem
... (other things in my PYTHONPATH)
/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

даже когда я попросил исключить "корневой каталог содержимого" из пути:

enter image description here

Это может привести к успешному импорту модулей, которые не смогут импортироваться в типичных развертываниях (например, при создании пакета).

Если я проверяю настройку, я получаю ее дважды:

/Users/Rax/Documents/Projects/pathproblem
... (other things in my PYTHONPATH)
/Users/Rax/Documents/Projects/pathproblem
...

Кажется, что PyCharm всегда добавляет текущий корень проекта в начале (что он считает) PYTHONPATH и что этот параметр просто добавляет его снова в конец.

(1) Как настроить PyCharm так, чтобы он (действительно) не добавлял каталог проекта в путь поиска пакета?

Кроме того, насколько я могу судить, PYTHONPATH для PyCharm не является моей системой PYTHONPATH вообще, но "добавленные пользователем" записи - фактически, смутно, в конце - настройки Path для Python Переводчик.

(2) Откуда берутся PyCharm PYTHONPATH? Это не PYTHONPATH, который я вижу где-либо еще в моей системе.


FWIW, PyCharm Sphinx уважает настройки "содержимого корня", добавляя корневой каталог только тогда, когда путь указан в конфигурации сборки.

Ответ 1

Прежде всего, когда я снимаю флажок с настроек (как в "консоли Python", так и в моей конфигурации запуска), я все равно вижу каталог для своего проекта в начале sys.path.

Это должно произойти, потому что PyCharm по умолчанию добавляет корень проекта в путь.

(1) Как настроить PyCharm так, чтобы он (действительно) не добавлял каталог проекта в путь поиска пакетов?

Насколько я знаю, вы не можете. Однако вы можете сделать что-то, что не добавит ваши файлы в маршрут контента. Однако, прежде чем показать вам, как это сделать, позвольте мне объяснить, почему он добавляет текущий корень каталога к своему пути. Когда вы открываете консоль Python:

enter image description here

Теперь у меня есть файл с именем foo.py, и в этом файле у меня есть функция с именем bar, поэтому я могу легко импортировать эту функцию в свою консоль:

enter image description here

Как вы можете видеть на изображении выше, PyCharm автоматически добавляет ваш текущий корень. Это не должно вызывать удивления, так как, когда вы cd в каталог и запустить что - то вроде python foo.py, вы неявно добавления текущего корня в путь. Чтобы эмулировать это в консоли Python, PyCharm добавляет текущий корень.

Чтобы избежать этого, вы можете просто создать папку внутри вашего текущего корня и пометить ее как корень источника:

enter image description here

И поскольку ваши корни источника не будут добавлены к пути, вы можете быть спокойны:

enter image description here

(2) Откуда приходит PyCharm PYTHONPATH? Это не PYTHONPATH, который я вижу где-либо еще в моей системе.

Это происходит из настроек вашего переводчика:

enter image description here

В общем, PYTHONPATH - это, по сути, коллекция всех каталогов, в которых хранятся ваши стандартные библиотечные файлы, а также сторонние библиотечные файлы.

Ответ 2

В этом случае "project/pathproblem" добавляется к sys.path самим Python, а не PyCharm. См. http://docs.python.org/2/library/sys.html#sys.path:" Как инициализировано при запуске программы, первым элементом этого списка, путь [0], является каталог, содержащий script, который использовался для вызова интерпретатора Python.

Чтобы ответить на ваш второй вопрос, PyCharm строит PYTHONPATH, запустив выбранный интерпретатор Python с помощью script, чтобы распечатать содержимое sys.path, записать его результат и затем добавить необходимые изменения в зависимости от настроек проекта (Django, App Engine и т.д.)