【问题标题】:Import Local module over global python通过全局 python 导入本地模块
【发布时间】:2012-07-14 09:59:51
【问题描述】:

我有 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"

【问题讨论】:

  • 我刚刚尝试在同一目录中创建一个带有import mathtest.py 和一个math.py,并且效果很好。我可以用我自己的math.py 拨打math.foo() 没有问题。
  • 我得到 AttributeError("'module' object has no attribute 'main'",)
  • 您能否提供一个小而完整的示例,准确说明您正在做什么以导致该错误?
  • 这里,我基本上是让用户输入一个字符串,将该字符串的第一个单词用作命令。该命令被传递给以该命令命名的模块。在这种情况下,我使用一个名为 math.py 的文件进行数学运算。

标签: python import python-2.7


【解决方案1】:

您可以使用相对导入:

from . import math

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

【讨论】:

  • 这对我的需要来说还不够好。无论如何,我已经尝试过了,只是得到了包错误。
【解决方案2】:

Python 进程有一个加载模块的命名空间。如果您(或任何其他模块)出于某种原因已经加载了标准的math 模块,那么尝试使用import__import__() 再次加载它只会返回对已经-加载的模块。您应该能够使用print id(math) 验证这一点并与print id(command) 进行比较。

虽然您已声明无法更改math.py 的名称,但我建议您可以。您正在从用户那里获取要加载的模块的名称。您可以在实际使用 __import__() 函数添加前缀之前对其进行修改。例如:

command = __import__("cmd_" + cstr)

然后,将math.py 重命名为cmd_math.py,您将避免此冲突。

【讨论】:

  • 谢谢,我会试试你的第二个建议。第一个不起作用,我收到一个名称错误,提示未定义数学。
猜你喜欢
  • 2017-12-20
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多