【问题标题】:Why does PyCharm always add "contents root" to my PYTHONPATH, and what PYTHONPATH?为什么 PyCharm 总是将“内容根”添加到我的 PYTHONPATH,以及什么 PYTHONPATH?
【发布时间】:2014-02-07 13:54:16
【问题描述】:

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

首先,当我取消选中设置时(在“Python 控制台”和我的运行配置中),我仍然在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

即使我已经要求从路径中排除“内容根目录”:

这可能会导致在典型部署中无法导入的模块成功导入(例如,在构建包时)。

如果我检查设置,我会得到两次:

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

似乎 PyCharm 总是 在 PYTHONPATH 的开头(它认为是什么)添加当前项目根目录,并且此设置只是将它再次添加到结束。

(1) 如何配置 PyCharm 使其(真的)不会将项目目录添加到包搜索路径中?

另外,据我所知,对于 PyCharm,PYTHONPATH 根本不是我的系统 PYTHONPATH,而是“用户添加”的条目——事实上,令人困惑的是,在 Python 的路径设置的末尾口译员。

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


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

【问题讨论】:

    标签: configuration path pycharm python-import


    【解决方案1】:

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

    应该是因为 PyCharm 默认将项目根添加到 Path 中。

    (1) 如何配置 PyCharm 使其(真的)不会将项目目录添加到包搜索路径中?

    据我所知,你不能。但是,您可以执行一些不将文件添加到内容路由的操作。但是,在向您展示如何执行此操作之前,让我解释一下为什么它将目录的当前根添加到其路径中。当你打开 python 控制台时:

                                                 

    现在,我有一个名为 foo.py 的文件,在该文件中我有一个名为 bar 的函数,因此我可以轻松地将函数导入我的控制台:

    如上图所示,PyCharm 自动添加您当前的根目录。这应该不足为奇,因为当您 cd 进入目录并运行类似 python foo.py 的内容时,您隐式将当前根目录添加到您的路径中。为了在 python 控制台中模拟这个,PyCharm 添加了当前的根目录。

    为避免这种情况,您可以简单地在当前根目录中创建一个文件夹,并将其标记为源根目录:

    而且由于您的 Source 根不会添加到路径中,您可以高枕无忧:

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

    它来自您的解释器设置:

    一般来说,PYTHONPATH 本质上是包含您的标准库文件以及您的第三方库文件的所有目录的集合。

    【讨论】:

    • "如上图所示,PyCharm 会自动添加您当前的根目录。"实际上,它似乎是come from Python itself。关于(2)的问题仍然存在:只是用户添加了路径吗?
    【解决方案2】:

    在这种情况下,“projects/pathproblem”是由 Python 本身而不是 PyCharm 添加到 sys.path 中的。请参阅http://docs.python.org/2/library/sys.html#sys.path:“在程序启动时初始化,此列表的第一项路径 [0] 是包含用于调用 Python 解释器的脚本的目录。”

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

    【讨论】:

    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2015-04-04
    相关资源
    最近更新 更多