【问题标题】:Permanently delete a path entry from my PATH inside virtualenv在 virtualenv 中从我的 PATH 中永久删除路径条目
【发布时间】:2023-04-08 14:27:02
【问题描述】:

我遇到了很多关于如何在 virtualenv 中添加 PATH 路径的答案,但没有关于如何删除路径的答案。我在 virtualenv 和以下代码 sn-p 中工作:

import sys
print sys.path

打印:

['',
 '/home/prk/Enthought/Canopy_64bit/User/lib/python2.7/site-packages',
 '', 
 '/home/prk/anaconda2/envs/dato-env/lib/python27.zip', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/plat-linux2', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/lib-tk', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/lib-old', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/lib-dynload', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/site-packages/setuptools-18.4-py2.7.egg', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/site-packages', 
 '/home/prk/anaconda2/envs/dato-env/lib/python2.7/site-packages/IPython/extensions', 
 '/home/prk/.ipython']

现在我想从这个列表中永久删除'/home/prk/Enthought/Canopy_64bit/User/lib/python2.7/site-packages'。实际上问题是我在我的python代码中导入了某个包(比如一个特定的包X)。现在这个包 X 位于我的 Enthought 路径(上面列表中的第一个路径)和 anaconda2上面列表中的第二个路径)内)。现在,当我导入 X 时,我希望它能够访问 anaconda 路径内的 X,但由于它通过上面的列表顺序搜索导入的包,它会找到它首先在Enthought 中尝试执行代码。我可以想到 3 种方法来解决这个问题:

  1. 从此列表中永久删除 '/home/prk/Enthought/Canopy_64bit/User/lib/python2.7/site-packages' 我想我将编辑 virtualenv 的初始化文件以删除或重新排序 PATH 以使其更符合我的喜好,但我不知道该怎么做.一个有效的临时修复方法是:

    import sys
    del sys.path[1]
    import X
    

    但是将它放在我的 virtualenv 中的每个 .py 文件中是不可能的。

  2. 另一种方法是在Enthought 路径之前以某种方式添加anaconda 路径。我读到了.pth files。我在我的 virtualenv 的站点包文件夹 (/home/prk/anaconda2/envs/dato-env/lib/python2.7/site-packages) 中放置了一个扩展名为 .pth 的文件,其中包含我的包的目录的绝对路径作为其唯一内容。这行不通。我在其中一个 cmets here 中读到它不适用于 linux。

  3. 我想我会删除并重新安装我的 virtualenv,使用所有路径从头开始重置它,但我不知道为什么它总是默认添加 Enthought 路径到我的清单的顶部。由于我在 virtualenv 中工作,所以该列表不应该只包含我的 virtualenv 内的路径(在 dato-env 内),因为所有其他路径都不是第一个路径吗?

编辑 1 在我的 virtualenv 中: $PATH 显示:

bash: /home/prk/anaconda2/envs/dato-env/bin:
/home/prk/Enthought/Canopy_64bit/User/bin:
/usr/local/sbin:/usr/local/bin:/usr/sbin:
/usr/bin:/sbin:/bin:/usr/local/sbin:
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games: No such file or directory

$PYTHONPATH$PYTHONHOME 不显示任何内容。

【问题讨论】:

  • 环境变量PYTHONPATHPYTHONHOME 在虚拟环境中的值是多少?当您使用-s 运行python 时会发生什么(不要将用户站点目录添加到sys.path
  • 你使用的是什么版本的virtualenv
  • @MartinKonecny 检查编辑。如何处理问题的第二部分?激活我的 dato-env(source activate dato-env)后,我正在打开一个 ipython 笔记本并进行处理。

标签: python bash path environment-variables virtualenv


【解决方案1】:

您可以编辑虚拟环境的“激活”bash 文件以删除您想要的目录。为此,基本上遵循以下步骤:

  1. 在文本编辑器中打开“激活”文件。你可以在
    ../your_virtual_environment_folder/bin/activate
    
  2. 在该文件的末尾添加以下行。

    directory_to_remove=/home/prk/Enthought/Canopy_64bit/User/bin
    PATH=:$PATH:
    PATH=${PATH//:$directory_to_remove:/:}
    PATH=${PATH#:}; PATH=${PATH%:}`
    
  3. 重新启动/重新激活您的虚拟环境。

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多