显然,我们在名为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
包也会发生同样的事情。这里有什么想法吗?
答案 0 :(得分:3)
您可以在python版本的.pth
文件夹中使用site-packages
文件为用户手动排序sys.path
。 easy_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的概念。如果你能:
export PYTHONPATH=$HOME/stuff/onpythonpath
pip install --target="$HOME/stuff/onpythonpath" pytabix
修改系统范围的配置文件应该在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级部分。 tabix
和pysam
似乎都有系统级依赖关系。因此,在没有安装CrossMap
的情况下创建干净的虚拟环境可以解决问题。
这对你来说是否真的是一个可行的解决方案是另一回事。我只是觉得我提出了我的两分钱,因为其他提议的解决方案似乎并不适合你。我个人觉得这对你的问题更好更清洁,而不是搞乱sys.path或手动设置模块指向某些文件。
Vagrant非常容易设置,并且是一个非常简单的方法,让整个团队在同一个环境中工作,使用他们习惯的主机上自己的工具。有关详细信息,请参阅http://docs.vagrantup.com/v2/getting-started/index.html。