如何防止python加载';错误';包裹

如何防止python加载';错误';包裹,python,packages,Python,Packages,显然,在我们的Python/2.7.2环境中加载了一个名为CrossMap的包,作为子包,tabix。当我启动这个版本的python并导入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/u init_uu.pyc,表明它是从交叉映射加载的。现在,即使我pip安装pytabix(在site packages目录

显然,在我们的
Python/2.7.2
环境中加载了一个名为
CrossMap
的包,作为子包,
tabix
。当我启动这个版本的python并导入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/u init_uu.pyc
,表明它是从
交叉映射加载的。现在,即使我
pip安装pytabix
(在
site packages
目录中创建一个
tabix.so
文件),它仍然会访问
CrossMap
版本。我甚至尝试使用
pip安装--user pytabix
安装
pytabix
来安装
localling,但它仍然加载
CrossMap
版本

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


更新:即使将
CrossMap
移动到“old_versions”目录,当我尝试加载
tabix
时,它仍然会遇到另一个包,该包将
tabix
作为子包。当我导入tabix
然后运行
tabix
时,我从
RSeQC-2.6.1
获得一个pysam包,即使我在主
站点包
目录中有
pytabix
作为自己的包。同样的事情也发生在
pysam
包中。有什么想法吗?

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

导入系统 sys.path.insert(0,“/path/to/your\u new\u path”)


然后像导入您的新路径一样导入。tabix

看起来您需要将pytabix放在sys.path前面出现的目录中,或者将CrossMap移动到路径下更远的目录中

我喜欢选择pytabix这个概念。如果可以:

  • 修改shell的系统配置文件(/etc/bash.bashrc)以包含以下内容:
    export PYTHONPATH=$HOME/stuff/onpythonpath
  • 使用
    pip安装--target=“$HOME/stuff/onpythonpath”pytabix
  • 修改系统范围的配置文件应该很早就将新路径放入
    sys.path

    选择pytabix的另一种方法是以可编辑模式安装它。在我的系统中,具有将新安装的软件包首先放置在sys.path中的效果:

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

    现在运行后:

    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']
    

    您可以使用python版本的
    站点包
    文件夹中的
    .pth
    文件为用户手动排序
    系统路径
    easy_install
    也使用此功能将内容添加到路径中。

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

    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()
    

    希望这有帮助。

    我建议您在项目中使用virtualenv。Virtualenv是避免名称空间污染和冲突的一种很好的方法


    要调试不知道特定模块隐藏在何处的情况,可以尝试在交互式Python shell中导入特定模块,并打印该模块的
    \uuuuu file\uu
    属性。但并非在所有情况下都能工作,例如压缩模块,但可以让您开始。

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

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

    这对你来说是否真的是一个可行的解决方案完全是另一回事。我只是想提出我的两分钱,因为其他建议的解决方案似乎不适合你。我个人也觉得这是一个更好、更干净的解决方案,比处理sys.path或手动设置模块指向某些文件要好


    不过,Vagrant非常容易设置,而且对于整个团队来说,在相同的环境中工作非常容易,使用他们自己的工具,从他们习惯的主机上进行操作。有关更多详细信息,请参阅。

    我可以试试,但我正在为多个用户进行群集范围的安装,他们希望
    import tabix
    能够开箱即用。我宁愿在后端找到一个解决方案,使
    import tabix
    指向正确的安装。即使有一种方法可以修改环境以代表他们这样做,那也会更好。有可能吗?为了能够导入同名软件包,用户应该将
    pytabix
    安装到
    C:\Python27
    或moveimport importlib.bar loader = importlib.bar.SourceFileLoader("module.name", "/path/to/file.py") foo = loader.load_module() foo.MyClass()