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

4ngedf3f  于 2023-05-23  发布在  Go
关注(0)|答案(6)|浏览(186)

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

iugsix8n

iugsix8n1#

您可以通过更改系统路径来切换搜索顺序:

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

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

ktca8awb

ktca8awb2#

我可以强制python在文件的开头导入全局变量from __future__ import absolute_import(这是python3.0中的默认设置)。

xmjla07d

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中的唯一项目,没有运气。
我仍然会得到:

print pip.__package__
# 'aero.adapters'

我发现两个选择最终对我有效,它们应该对你同样有效:

使用__builtin__.__import__()内置函数

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

阅读文档后,建议使用以下方法。

使用importlib.import_module()__import__ conv Package 器。

documentation解释说,import_module()是Python 3.1的一个次要功能子集,有助于简化从2.7到3.1的转换

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

这两种选择都能完成任务,而import_module()肯定更像Python,如果你问我,你同意吗?
nJoy!

mtb9vblg

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文档)当前目录,因此如果您删除它,您将执行全局导入。

oknwwptz

oknwwptz5#

因为我的test_utils在一个django项目中,所以我可以去from ..test_utils import ...导入全局的。

7kjnsjlb

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

相关问题