Почему 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 и т.д.)