如何防止python加载'错误'包?

时间:2015-06-22 13:29:40

标签: python packages

显然,我们在名为Python/2.7.2的{​​{1}}环境中加载了一个包,其中包含CrossMap作为子包。当我启动此版本的python和tabix时,import tabix会显示:tabix表示它是从/hpcf/apps/python/install/2.7.2/lib/python2.7/site-packages/CrossMap-0.1.6-py2.7-linux-x86_64.egg/tabix/__init__.pyc加载的。现在,即使我CrossMap(在pip install pytabix目录中创建tabix.so文件),它仍然会访问site-packages版本。我甚至尝试使用CrossMap安装pytabix localling,但它仍会加载pip install --user pytabix版本。

如何将CrossMap指向import tabix文件而不是tabix.so的子包?

更新:即使在将CrossMap移至'old_versions'目录后,当我尝试加载CrossMap时,它仍然会遇到另一个包含tabix作为子包的包。当我tabix然后运行import tabix时,我从tabix获得了一个pysam包,即使我在RSeQC-2.6.1主目录中有pytabix个自己的包。 site-packages包也会发生同样的事情。这里有什么想法吗?

6 个答案:

答案 0 :(得分:3)

您可以在python版本的.pth文件夹中使用site-packages文件为用户手动排序sys.patheasy_install使用此功能将鸡蛋内容添加到您的路径中。

答案 1 :(得分:1)

您可以尝试将pytabix安装到不同的文件夹pip install --target="/path/to/your_new_path" pytabix,并将此新路径添加到sys.path

import sys sys.path.insert(0, "/path/to/your_new_path")

然后导入import your_new_path.tabix

答案 2 :(得分:1)

您似乎需要将pytabix放在sys.path中较早出现的目录中,或者将CrossMap移动到路径下方的目录中。

我喜欢偏爱pytabix的概念。如果你能:

  1. 修改shell的系统配置文件(/etc/bash.bashrc),使其包含如下内容:export PYTHONPATH=$HOME/stuff/onpythonpath
  2. 使用pip install --target="$HOME/stuff/onpythonpath" pytabix
  3. 修改系统范围的配置文件应该在sys.path。{/ p>中尽早放置新路径

    更喜欢pytabix的另一种方法是将其安装在可编辑模式下。在我的系统中,它具有将新安装的软件包放在sys.path中的第一个作用:

    例: 之前的路径(包括通过在配置文件中导出PYTHONPATH而添加的“onpythonpath”):

     ['',
      '/usr/local/bin',
      '/home/keith/devel/onpythonpath',
      '/usr/lib/python2.7',
      '/usr/lib/python2.7/plat-x86_64-linux-gnu',
      '/usr/lib/python2.7/lib-tk',
      '/usr/lib/python2.7/lib-old',
      '/usr/lib/python2.7/lib-dynload',
      '/usr/local/lib/python2.7/dist-packages']
    

    现在运行后:

    pip install -e git+https://github.com/slowkow/pytabix.git@40e7a78ba6fdfbf72a25da718f530e7c1bad389e#pytabix
    

    这是我的路径:

    ['',
     '/usr/local/bin',
     '/home/keith/src/pytabix',
     '/home/keith/devel/onpythonpath',
     '/usr/lib/python2.7',
     '/usr/lib/python2.7/plat-x86_64-linux-gnu',
     '/usr/lib/python2.7/lib-tk',
     '/usr/lib/python2.7/lib-old',
     '/usr/lib/python2.7/lib-dynload',
     '/usr/local/lib/python2.7/dist-packages']
    

答案 3 :(得分:1)

导入任何模块时,它首先查找当前目录, 之后,它开始查看系统路径,按照它们的外观顺序(按时间顺序), 检查使用:

import sys 
print sys.path

所以,初学者的方法是交换列表元素,并在第0个索引处放置我们需要首先导入的路径,(交换列表) 为了理解这个概念,可以做到以上几点。 (从来没有一个真正的实施方法)

或者如果您可以在导入之前附加路径

import sys
# the PackageFolder dir contains foo.py, bar.py 
sys.path.append('/foo/bar/PackageFolder')

from foo import ChocolateClass
from bar import RunClass,WalkClass

更好的方法是指定要从中导入模块的路径:

import bar
foo = bar.load_source('module.name', '/path/to/file.py')
foo.MyClass()

编译的Python文件和DLL有相同的便利功能。 对于Python 3.3+,不幸的是,这涉及更多:

import importlib.bar
loader = importlib.bar.SourceFileLoader("module.name", "/path/to/file.py")
foo = loader.load_module()
foo.MyClass()

希望这有帮助。

答案 4 :(得分:1)

我建议你为你的项目使用virtualenv。 Virtualenv是避免命名空间污染和像你一样的争论的绝佳方法。

要调试您不知道特定模块隐藏位置的情况,您可以尝试在交互式Python shell中导入特定模块并打印模块的__file__属性。但是,在所有情况下都不起作用,例如压缩模块,但可以帮助您入门。

答案 5 :(得分:1)

据我所知,解决此问题的最简洁方法是由虚拟机管理程序(如Vagrant)提供的完全隔离,而不是virtualenv提供的部分隔离。

我不知道您是否熟悉virtualenv,但问题在于它只提供了python级别的隔离。对于依赖于系统库的python包,只隔离这些包的python级部分。 tabixpysam似乎都有系统级依赖关系。因此,在没有安装CrossMap的情况下创建干净的虚拟环境可以解决问题。

这对你来说是否真的是一个可行的解决方案是另一回事。我只是觉得我提出了我的两分钱,因为其他提议的解决方案似乎并不适合你。我个人觉得这对你的问题更好更清洁,而不是搞乱sys.path或手动设置模块指向某些文件。

Vagrant非常容易设置,并且是一个非常简单的方法,让整个团队在同一个环境中工作,使用他们习惯的主机上自己的工具。有关详细信息,请参阅http://docs.vagrantup.com/v2/getting-started/index.html