首页 文章

为什么PyCharm总是在我的PYTHONPATH中添加“内容根”,以及什么是PYTHONPATH?

提问于
浏览
11

我对PyCharm如何确定Python用于定位模块和包的路径感到困惑 .

首先,当我取消选中设置时(在"Python Console"和我的运行配置中),我仍然会在 sys.path 的开头看到我的项目的目录 .

例如,我在“路径问题”和“运行”包含的文件中有项目

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的开头(它认为是)PYTHONPATH添加当前的项目根,并且这个设置最后再添加它 .

(1) How do I configure PyCharm so that it (really) doesn't add the project directory to the package search path?

另外,就我所知,PYTHONPATH,对于PyCharm来说,根本不是我的系统PYTHONPATH,而是“用户添加”条目 - 实际上,令人困惑的是,在Python解释器的Path设置的末尾 .

(2) Where does PyCharm's PYTHONPATH come from? It's not the PYTHONPATH I see anywhere else on my system.


FWIW,PyCharm的Sphinx尊重“内容根”设置,仅在构建配置中检查路径时添加内容根 .

2 回答

  • 2

    首先,当我取消选中设置时(在“Python控制台”和我的运行配置中),我仍然在sys.path的开头看到我的项目的目录 .

    这应该是因为PyCharm默认将项目路由添加到Path .

    (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

    由于您的Source根目录不会添加到路径中,因此您可以轻松休息:

    enter image description here

    (2)PyCharm的PYTHONPATH来自哪里?这不是我在系统中其他地方看到的PYTHONPATH .

    它来自您的翻译设置:

    enter image description here

    通常, PYTHONPATH 本质上是包含标准库文件的所有目录的集合,以及第三方库文件 .

  • 13

    在这种情况下,"projects/pathproblem"由Python本身添加到sys.path,而不是由PyCharm添加 . 见http://docs.python.org/2/library/sys.html#sys.path:"As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter."

    为了回答你的第二个问题,PyCharm通过运行选定的Python解释器和脚本来构建PYTHONPATH,以打印sys.path的内容,记录其结果,然后根据项目设置添加必要的更改(Django,App Engine等)

相关问题