我用的是python和virtualenv/pip。我通过pip安装了一个名为test_utils的模块(它是django-test-utils)。在我的一个django应用程序中,我想导入该模块。但是我在同一目录下还有另一个文件test_utils.py。如果我转到import test_utils,那么它将导入这个本地文件。是否可以让Python使用非本地/非相对/全局导入?我想我可以重命名我的test_utils.py,但我很好奇。
test_utils
test_utils.py
import test_utils
iugsix8n1#
您可以通过更改系统路径来切换搜索顺序:
del sys.path[0] sys.path.append('')
这会将当前目录放在系统搜索路径之后,因此本地文件不会隐藏标准模块。
ktca8awb2#
我可以强制python在文件的开头导入全局变量from __future__ import absolute_import(这是python3.0中的默认设置)。
from __future__ import absolute_import
xmjla07d3#
我的问题更复杂:
global/site-packages
在aero the pm recycler上工作时,我想访问pip API,特别是从源文件pip.py中的适配器类Pip访问pip.commands.search.SearchCommand。在这种情况下,尝试修改sys.path是无用的,我甚至完全擦除sys.path,并添加文件夹.../site-packages/pip...egg/作为sys.path中的唯一项目,没有运气。我仍然会得到:
pip.commands.search.SearchCommand
sys.path
.../site-packages/pip...egg/
print pip.__package__ # 'aero.adapters'
我发现两个选择最终对我有效,它们应该对你同样有效:
__builtin__.__import__()
global_pip = __import__('pip.commands.search', {}, {}, ['SearchCommand'], -1) SearchCommand = global_pip.SearchCommand
阅读文档后,建议使用以下方法。
importlib.import_module()
__import__
documentation解释说,import_module()是Python 3.1的一个次要功能子集,有助于简化从2.7到3.1的转换
import_module()
from importlib import import_module SearchCommand = import_module('pip.commands.search').SearchCommand
这两种选择都能完成任务,而import_module()肯定更像Python,如果你问我,你同意吗?nJoy!
mtb9vblg4#
您可以重置sys.path:
import sys first = sys.path[0] sys.path = sys.path[1:] import test_utils sys.path = first + sys.path
sys.path的第一个条目是“always”(与“per default”相同):请参阅python文档)当前目录,因此如果您删除它,您将执行全局导入。
oknwwptz5#
因为我的test_utils在一个django项目中,所以我可以去from ..test_utils import ...导入全局的。
from ..test_utils import ...
7kjnsjlb6#
虽然,首先,我总是会考虑保持本地文件的名称与任何全局模块名称不匹配,一个简单的解决方案,而不修改“sys.path”可以在其他文件中包含全局模块,然后从该文件导入此全局模块。请记住,此文件必须在其他文件夹中,然后在文件名与全局模块匹配的文件所在的文件夹中。举个例子。./project/root/workarounds/global_import.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
6条答案
按热度按时间iugsix8n1#
您可以通过更改系统路径来切换搜索顺序:
这会将当前目录放在系统搜索路径之后,因此本地文件不会隐藏标准模块。
ktca8awb2#
我可以强制python在文件的开头导入全局变量
from __future__ import absolute_import
(这是python3.0中的默认设置)。xmjla07d3#
我的问题更复杂:
从同名文件***导入
global/site-packages
模块***在aero the pm recycler上工作时,我想访问pip API,特别是从源文件pip.py中的适配器类Pip访问
pip.commands.search.SearchCommand
。在这种情况下,尝试修改
sys.path
是无用的,我甚至完全擦除sys.path
,并添加文件夹.../site-packages/pip...egg/
作为sys.path
中的唯一项目,没有运气。我仍然会得到:
我发现两个选择最终对我有效,它们应该对你同样有效:
使用
__builtin__.__import__()
内置函数阅读文档后,建议使用以下方法。
使用
importlib.import_module()
的__import__
conv Package 器。documentation解释说,
import_module()
是Python 3.1的一个次要功能子集,有助于简化从2.7到3.1的转换这两种选择都能完成任务,而
import_module()
肯定更像Python,如果你问我,你同意吗?nJoy!
mtb9vblg4#
您可以重置
sys.path
:sys.path
的第一个条目是“always”(与“per default”相同):请参阅python文档)当前目录,因此如果您删除它,您将执行全局导入。oknwwptz5#
因为我的
test_utils
在一个django项目中,所以我可以去from ..test_utils import ...
导入全局的。7kjnsjlb6#
虽然,首先,我总是会考虑保持本地文件的名称与任何全局模块名称不匹配,一个简单的解决方案,而不修改“sys.path”可以在其他文件中包含全局模块,然后从该文件导入此全局模块。
请记住,此文件必须在其他文件夹中,然后在文件名与全局模块匹配的文件所在的文件夹中。
举个例子。./project/root/workarounds/global_import.py
然后在 ./project/root/mycode/test_utils.py