Python - Импорт модуля global / site-packages вместо файла с тем же именем в локальном каталоге - PullRequest
1 голос
/ 14 марта 2011

Я использую python и virtualenv / pip.У меня установлен модуль через pip test_utils (это django-test-utils).В одном из моих приложений django я хочу импортировать этот модуль.Однако у меня также есть другой файл test_utils.py в том же каталоге.Если я пойду import test_utils, то он импортирует этот локальный файл.

Можно ли заставить python использовать нелокальный / не относительный / глобальный импорт?Полагаю, я могу просто переименовать мой test_utils.py, но мне любопытно.

Ответы [ 6 ]

4 голосов
/ 14 марта 2011

Вы можете изменить порядок поиска, изменив sys.path:

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

. Этот каталог ставит текущий каталог после пути поиска в системе, поэтому локальные файлы не будут затенять стандартные модули.

1 голос
/ 19 сентября 2017

Мне удалось заставить Python импортировать глобальный с from __future__ import absolute_import в начале файла (по умолчанию в python 3.0)

1 голос
/ 05 декабря 2012

Моя проблема была еще более сложной:

импорт global/site-packages модуля из файла с тем же именем

Работа над aero the pm recycler Я хотел получить доступ к pip api, в частности pip.commands.search.SearchCommand из моего адаптера класса Pip в исходном файле pip.py.

В этом случае попытка изменить 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() определенно чувствует себя более питоническим, если вы спросите меня, вы согласитесь?

nJoy!

0 голосов
/ 23 марта 2017

Хотя, во-первых, я бы всегда рассматривал возможность сохранения имени локального файла, не совпадающего с каким-либо глобальным именем модуля, простым обходным путем, без изменения «sys.path», который может включать глобальный модуль в некоторый другой файл, а затемимпортируйте этот глобальный модуль из этого файла.

Помните, что этот файл должен находиться в другой папке, а не в папке, где находится файл с именем, совпадающим с глобальным модулем.

Например.. / Project / root / обходные пути / 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
0 голосов
/ 18 марта 2011

Поскольку мой test_utils был в проекте django, я смог пойти from ..test_utils import ..., чтобы импортировать глобальный.

0 голосов
/ 14 марта 2011

Вы можете сбросить sys.path:

import sys
first = sys.path[0]
sys.path = sys.path[1:]
import test_utils
sys.path = first + sys.path

Первая запись sys.path - это «всегда» (как в «по умолчанию»: см. документы по Python )текущий каталог, поэтому, если вы удалите его, вы выполните глобальный импорт.

...