2

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

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

4

6 回答 6

5

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

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

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

于 2011-03-14T13:43:48.683 回答
1

我的问题更详细:

从同名文件中导入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

不过,阅读文档,建议改用以下方法。

使用conv 包装器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,你同意吗?

开心!

于 2012-12-05T01:08:31.733 回答
1

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

于 2017-09-19T14:42:21.893 回答
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 文档)当前目录,因此如果您删除它,您将执行全局导入。

于 2011-03-14T13:43:25.320 回答
0

由于我test_utils在一个 django 项目中,我能够from ..test_utils import ...导入全局项目。

于 2011-03-18T11:02:30.300 回答
0

虽然,首先,我总是会考虑保持本地文件的名称不与任何全局模块名称匹配,一个简单的解决方法,无需修改 '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
于 2017-03-23T17:52:25.857 回答