我正在使用python和virtualenv / pip。我通过名为test_utils
的pip安装了一个模块(它是django-test-utils)。在我的一个django应用程序中,我想导入该模块。但是我在同一目录中还有另一个文件test_utils.py
。如果我转到import test_utils
,它将导入此本地文件。
是否可以让python使用非本地/非相对/全局导入?我想我可以重命名test_utils.py
,但我很好奇。
答案 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