Импортировать локальный модуль через глобальный python

У меня есть 2 файла python. Один пытается импортировать второй. Моя проблема в том, что второй называется math.py. не могу переименовать. Когда я пытаюсь вызвать функцию, расположенную внутри math.py, я не могу, потому что получаю глобальный математический модуль. Как мне импортировать мой локальный файл вместо глобального. Я использую Python 2.7, и это (примерно) мой статус импорта:

cstr = "math"
command = __import__(cstr)

Позже я пытаюсь:

command.in_math_py_not_global()

Изменить: более полный пример:

def parse(self,string):
    clist = string.split(" ")
    cstr= clist[0]
    args = clist[1:len(clist)]
    rvals = []
    try:
        command = __import__(cstr)
        try:
            rvals.extend(command.main(args))
        except:
            print sys.exc_info()
    except ImportError:
        print "Command not valid"

person jbills    schedule 15.07.2012    source источник
comment
Я только что попытался создать test.py с import math и math.py в одном и том же каталоге, и это сработало нормально. Я мог без проблем позвонить math.foo() в свой math.py.   -  person Greg Hewgill    schedule 15.07.2012
comment
Я получаю AttributeError (объект «модуль» не имеет атрибута «основной»)   -  person jbills    schedule 15.07.2012
comment
Можете ли вы предоставить небольшой полный пример, который точно показывает, что вы делаете, чтобы вызвать эту ошибку?   -  person Greg Hewgill    schedule 15.07.2012
comment
Там я в основном позволяю пользователю вводить строку, причем первое слово этой строки используется в качестве команды. Команда передается модулю, названному в честь команды. В этом случае у меня есть математика с файлом math.py.   -  person jbills    schedule 15.07.2012


Ответы (2)


Процессы Python имеют единое пространство имен загруженных модулей. Если вы (или любой другой модуль) по какой-либо причине уже загрузили стандартный модуль math, то попытка загрузить его снова с помощью import или __import__() просто вернет ссылку на уже загруженный модуль. Вы должны быть в состоянии проверить это, используя print id(math) и сравнив с print id(command).

Хотя вы заявили, что не можете изменить имя math.py, я предлагаю вам это сделать. Вы получаете имя модуля для загрузки от пользователя. Вы можете изменить это перед фактическим использованием функции __import__() для добавления префикса. Например:

command = __import__("cmd_" + cstr)

Затем переименуйте math.py в cmd_math.py, и вы избежите этого конфликта.

person Greg Hewgill    schedule 15.07.2012
comment
Спасибо, я попробую ваше второе предложение. Первый не сработал, я получил ошибку имени, говорящую о том, что математика не определена. - person jbills; 15.07.2012

Вы можете использовать относительный импорт:

from . import math

http://docs.python.org/tutorial/modules.html#intra-package-references

person Acorn    schedule 15.07.2012
comment
Этого недостаточно для того, что мне нужно. В любом случае, я пробовал это и получил только ошибки пакета. - person jbills; 15.07.2012