在Python中,如何导入本地模块而不是全局模块?

6

我有两个 Python 文件。其中一个试图导入第二个。我的问题是第二个文件的名字是 math.py,我无法改变它。当我试图调用 math.py 中的函数时,因为全局 math 模块的存在,我无法实现。如何导入本地文件而不是全局文件?我正在使用 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"

1
我刚刚尝试创建了一个名为test.py的文件,并在同一目录下创建了一个math.py文件,使用import math导入。一切都正常工作,我可以毫无问题地在自己的math.py中调用math.foo() - Greg Hewgill
我收到了AttributeError("'module' object has no attribute 'main'",)的错误。 - jbills
你能提供一个小而完整的示例,展示出导致该错误的具体操作吗? - Greg Hewgill
在这里,我基本上让用户输入一个字符串,该字符串的第一个单词用作命令。该命令被传递给以该命令命名的模块。在这种情况下,我有一个名为math.py的文件,其中包含数学模块。 - jbills
2个回答

3

这对我所需的内容来说还不够好。无论如何,我尝试过了,但只得到了软件包错误。 - jbills

3
Python进程具有单个已加载模块的命名空间。如果您(或任何其他模块)已经基于任何原因加载了标准的math模块,则尝试使用import或__import__()再次加载它将简单地返回对已加载模块的引用。您应该能够使用print id(math)进行验证,并与print id(command)进行比较。
虽然您已经声明无法更改math.py的名称,但我建议您可以这样做。您正在从用户获取要加载的模块的名称。在实际使用__import__()函数之前,您可以修改此名称以添加前缀。例如:
command = __import__("cmd_" + cstr)

接着,将 math.py 重命名为 cmd_math.py ,就可以避免这个冲突。


谢谢,我会尝试你的第二个建议。第一个没有起作用,出现了一个名称错误,说 math 未定义。 - jbills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接