Python - 导入global / site-packages模块,而不是本地目录中的同名文件

时间:2011-03-14 13:28:49

标签: python django import python-module

我正在使用python和virtualenv / pip。我通过名为test_utils的pip安装了一个模块(它是django-test-utils)。在我的一个django应用程序中,我想导入该模块。但是我在同一目录中还有另一个文件test_utils.py。如果我转到import test_utils,它将导入此本地文件。

是否可以让python使用非本地/非相对/全局导入?我想我可以重命名test_utils.py,但我很好奇。

6 个答案:

答案 0 :(得分:4)

您可以通过更改sys.path来切换搜索顺序:

del sys.path[0]
sys.path.append('')

这会将当前目录放在系统搜索路径之后,因此本地文件不会影响标准模块。

答案 1 :(得分:1)

我的问题更加精细:

从具有相同名称的文件 导入global/site-packages模块

使用aero the pm recycler我希望从源文件pip.py中的适配器类Pip访问pip api,特别是pip.commands.search.SearchCommand

在这种情况下,尝试修改sys.path是没用的,我甚至完全擦除sys.path并将文件夹.../site-packages/pip...egg/添加为sys.path中的唯一项目没运气。

我仍然会得到:

print pip.__package__
# 'aero.adapters' 

我找到了两个最终适合我的选项,它们应该同样适合你:

使用__builtin__.__import__()内置函数

global_pip = __import__('pip.commands.search', {}, {}, ['SearchCommand'], -1)
SearchCommand = global_pip.SearchCommand

虽然阅读documentation,但建议使用以下方法。

使用importlib.import_module() __import__转包装。

documentation解释说import_module()是Python 3.1的一小部分功能,有助于简化从2.7到3.1的转换

from importlib import import_module
SearchCommand = import_module('pip.commands.search').SearchCommand

两个选项都可以完成工作,import_module()如果你问我,你肯定会感觉更像Pythonic吗?你同意吗?

的nJoy!

答案 2 :(得分:1)

我能够强制python导入全局的 from __future__ import absolute_import 在文件的开头(这是python 3.0中的默认值)

答案 3 :(得分:0)

您可以重置sys.path

import sys
first = sys.path[0]
sys.path = sys.path[1:]
import test_utils
sys.path = first + sys.path

sys.path的第一个条目是“始终”(如“默认情况下”:请参阅python docs)当前目录,因此如果删除它,则会进行全局导入。

答案 4 :(得分:0)

由于我的test_utils在django项目中,我可以from ..test_utils import ...导入全局项目。

答案 5 :(得分:0)

虽然,首先,我总是会考虑保持本地文件的名称与任何全局模块名称不匹配,这是一种简单的解决方法,无需修改' sys.path'可以将全局模块包含在其他文件中,然后从该文件中导入该全局模块。

请记住,此文件必须位于其他文件夹中,然后位于名称与global module匹配的文件所在的文件夹中。

例如。 ./project / root / workarounds / global_imports.py

import test_utils as tutil

然后进入 ./项目/根/ mycode的/ test_utils.py

from project.root.workarounds.global_imports import tutil
# tutil is global test_utils

# you can also do 
from project.root.workarounds.global_imports import test_utils