如何防止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这个概念。如果可以:
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()