我正在使用 python 和 virtualenv/pip。我有一个通过 pip 安装的模块test_utils
(它是 django-test-utils)。在我的一个 django 应用程序中,我想导入该模块。test_utils.py
但是我在同一目录中还有另一个文件。如果我去import test_utils
,那么它将导入这个本地文件。
是否可以让 python 使用非本地/非相对/全局导入?我想我可以重命名我的test_utils.py
,但我很好奇。
我正在使用 python 和 virtualenv/pip。我有一个通过 pip 安装的模块test_utils
(它是 django-test-utils)。在我的一个 django 应用程序中,我想导入该模块。test_utils.py
但是我在同一目录中还有另一个文件。如果我去import test_utils
,那么它将导入这个本地文件。
是否可以让 python 使用非本地/非相对/全局导入?我想我可以重命名我的test_utils.py
,但我很好奇。
您可以通过更改 sys.path 来切换搜索顺序:
del sys.path[0]
sys.path.append('')
这会将当前目录放在系统搜索路径之后,因此本地文件不会影响标准模块。
我的问题更详细:
global/site-packages
模块在aero pm recycler上工作,我想访问 pip api,特别是pip.commands.search.SearchCommand
从源文件 pip.py 中的适配器类 Pip。
在这种情况下,尝试修改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
不过,阅读文档,建议改用以下方法。
importlib.import_module()
。__import__
该文档解释说,这import_module()
是 Python 3.1 的一小部分功能,有助于轻松从 2.7 过渡到 3.1
from importlib import import_module
SearchCommand = import_module('pip.commands.search').SearchCommand
import_module()
如果你问我,这两种选择都可以完成工作,而绝对感觉更像 Pythonic,你同意吗?
开心!
我能够强制 python
from __future__ import absolute_import
在文件开头导入全局文件(这是 python 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 文档)当前目录,因此如果您删除它,您将执行全局导入。
由于我test_utils
在一个 django 项目中,我能够from ..test_utils import ...
导入全局项目。
虽然,首先,我总是会考虑保持本地文件的名称不与任何全局模块名称匹配,一个简单的解决方法,无需修改 'sys.path' 可以将全局模块包含在其他文件中,然后导入这个全局该文件中的模块。
请记住,此文件必须位于其他文件夹中,然后位于名称与全局模块匹配的文件所在的文件夹中。
例如。 ./project/root/workarounds/global_imports.py
import test_utils as tutil
然后在 ./project/root/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