更改 pythonpath 的优先级

change the priority of pythonpath

当我加载某些模块 [即 pygments.lexers Bash Lexer 和 pygments.formatters LatexFormatter] 时,我遇到了 python 找不到模块的错误.然后我意识到这个问题是由我的 PYTHONPATH 引起的,它被设置为使用 paraview 和 python。它带来了自己的 pygments 版本,由于某种原因,它不能与 jupyter notebook 中的 nbconvert 一起使用上面提到找不到了。

我对 mayavi 也有类似的问题,它不适用于 paraview 的 vtk 版本。

这两个问题都可以通过在 bashrc 中注释掉 python 路径来简单地解决,但显然 paraview 将无法工作。

有没有什么办法,比如降低PYTHONPATH的优先级,让/etc...中的系统代码优先被调用,但是paraview仍然可以在PYTHONPATH中找到它需要的?

我在 linux mint 17.3 上使用 python 2.76,paraview 是版本 4.4.0,根据 here

从源代码安装

是的,您可以 import sys 并在运行时将 sys.path 作为普通列表进行操作。您可以重新排列那里的内容,或者只插入开头 (sys.path.insert(0, 'path'))。在您的 import 声明之前执行此操作。如果这会在其他地方引起问题,请将其放回 import 语句之后。

请注意,这很老套。但听起来你可能有理由这样做,尽管我没有一起看过这些特定的工具。

编辑:如果您想在 python 的一次执行过程中在 单独导入 级别控制 python 路径,则此操作更为相关].如果你想在 Python 的一次完整执行级别控制路径,你还可以在命令行上为该执行设置 python 路径,如下所示:

PYTHONPATH=/replacement/path/here python your_script.py

这比仅调用 python 更冗长(除非您将其包装在 shell 脚本或别名中),但它允许您一次控制一个脚本的路径,将它放在哪里进入 .bashrc/.bash_profile 或对整个 shell 会话进行类似更改。

export PYTHONPATH=$PYTHONPATH:<your_path> 将优先考虑系统路径,只有当系统路径不存在时才会查找您的路径。

export PYTHONPATH=<your_path>:$PYTHONPATH 将首先搜索 <your_path>,然后在 $PYTHONPATH 中搜索未找到的内容。

如果两者都存在某些内容,但您想将它的一个版本用于一个程序而将另一个版本用于另一个程序,那么您可能需要查看不同的 bashrc 配置文件。

对 PYTHONPATH 中的条目进行排序部分正确,但系统路径似乎并未包含在内直到您 运行 python,然后他们被放在最后。所以要在前面放一个系统路径,显式加上:

export PYTHONPATH="[path/to/system/files]:$PYTHONPATH"

这是一种 hack,因为您添加的系统路径将在 sys.path 中重复。但它有效。