改变pythonpath的优先级
Posted
技术标签:
【中文标题】改变pythonpath的优先级【英文标题】:change the priority of pythonpath 【发布时间】:2016-02-25 02:19:21 【问题描述】:当我加载某些模块 [即 pygments.lexers Bash Lexer 和 pygments.formatters LatexFormatter] 时,我收到一个错误,即 python 找不到模块。然后我意识到这个问题是由我的 PYTHONPATH 引起的,它被设置为在 python 中使用paraview。它带来了自己的 pygments 版本,由于某种原因,它不能与 jupyter notebook 中的 nbconvert 一起使用 [注意它并非完全不起作用,因为 PythonLexer,并且其他一些被调用没有问题,它只是那些我'上面提到的找不到]。
我对 mayavi 也有类似的问题,它不适用于 paraview 的 vtk 版本。
这两个问题都可以通过在bashrc中注释掉python路径来解决,但是很明显paraview就不行了。
有没有什么办法,比如降低PYTHONPATH的优先级,从而优先调用/etc...中的系统代码,但是paraview仍然可以在PYTHONPATH中找到它需要的代码?
我在 linux mint 17.3 上使用 python 2.76,paraview 是 4.4.0 版本,根据here从源代码安装
【问题讨论】:
【参考方案1】:对 PYTHONPATH 中的条目进行排序部分正确,但系统路径似乎没有被包含在直到你运行 python,然后它们被放在最后。所以要把系统路径放在前面,显式添加:
export PYTHONPATH="[path/to/system/files]:$PYTHONPATH"
这是一种 hack,因为您添加的系统路径将在 sys.path 中复制。但它有效。
【讨论】:
【参考方案2】:是的,您可以在运行时将import sys
和sys.path
操作为普通列表。您可以重新排列那里的内容,或者只是在开头插入 (sys.path.insert(0, 'path')
)。在您的 import
声明之前执行此操作。如果这会在其他地方引起问题,请将其放回您的 import
语句之后。
注意,这是相当hacky。但听起来你可能有它的理由,虽然我没有一起研究这些特定的工具。
编辑:如果您想在一次执行 python 的过程中控制 单独导入 级别的 python 路径,这更相关。如果您想在 Python 的一次完整执行级别控制路径,您还可以在命令行上为该执行设置 python 路径,如下所示:
PYTHONPATH=/replacement/path/here python your_script.py
这比调用 python 更冗长(除非你将它包装在 shell 脚本或别名中),但它允许你一次控制一个脚本的路径,将它放入 .bashrc
/.bash_profile
或类似的为您的整个 shell 会话更改它。
【讨论】:
这似乎也不起作用,它只是将“路径”添加到 sys.path 的开头,当我导入相同的函数时 - 例如 pygments.lexers - 它仍在调用来自 python 路径的那些 'Path' 表示要插入的文件系统路径。 对,这是有道理的。这对于在代码中调用函数很好,但是对于从命令行调用函数仍然不起作用。我尝试调用它并将其插入到我的 pythonrc 中,但我仍然得到相同的错误从命令行调用应用程序 也许我误解了你的问题。我认为您需要能够在同一执行中使用两个 pythonpaths 才能使两个不同的事情工作。 如果您只需要在每个命令行执行时控制它,那么您可能应该使用PYTHONPATH
env var。【参考方案3】:
export PYTHONPATH=$PYTHONPATH:<your_path>
将优先考虑系统路径,并且只有在不存在的情况下才会查看您的路径。
export PYTHONPATH=<your_path>:$PYTHONPATH
将首先搜索 <your_path>
,然后搜索 $PYTHONPATH 以查找它没有找到的内容。
如果两者都存在,但您想将一个版本用于一个程序,另一个用于另一个程序,那么您可能需要查看不同的 bashrc 配置文件。
【讨论】:
我试过实现这个,但它似乎不起作用。 Python 还是先读 $PYTHONPATH,有什么建议吗? 您是从终端启动程序吗?因为如果你不这样做并且你从他们的快捷方式启动器启动它们,那么PYTHONPATH
没有设置。 `echo $PYTHONPATH$ 的输出(在终端中运行)是什么?
从终端启动,echo $PYTHONPATH 返回:/home/sean/OpenFOAM/ThirdParty-3.0.x/platforms/linux64Gcc/ParaView-4.4.0/lib/paraview-4.4/site-packages :/home/sean/OpenFOAM/ThirdParty-3.0.x/platforms/linux64Gcc/ParaView-4.4.0/lib/paraview-4.4/site-packages/vtk
这就是路径的优先级。但是要考虑到程序需要从终端启动,你这样做了吗?
是的,程序正在从终端启动,问题是我想更改顺序,以便系统路径优先于 openFOAM 目录以上是关于改变pythonpath的优先级的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Dockerfile 中添加 PYTHONPATH 的路径