似乎没有执行库定义中的Import语句

时间:2011-02-25 08:10:46

标签: python import nameerror

我遇到的问题可能是一个非常基本的问题,但作为一名Python学习者,我一直在努力工作几个小时。到目前为止,文档还没有给我答案。

问题是当我从python脚本导入此模块时,似乎没有执行模块中包含的import语句。我所拥有的如下:

我有一个文件project.py(即python库),如下所示:

import datetime

class Project:
    """ This class is a container for project data """

    title        = ""
    manager      = ""
    date         = datetime.datetime.min

    def __init__( self, title="", manager="", date=datetime.datetime.min ):
    """ Init function with some defaults """

        self.title        = title
        self.manager      = manager
        self.date         = date

此库稍后用于导入项目的脚本(file.py),它的开头如下:

import project

print datetime.datetime.min

当我尝试使用Python file.py执行此脚本时,会出现问题。然后Python抱怨以下NameError:

Traceback (most recent call last):
  File "file.py", line 3, in <module>
    print datetime.datetime.min
NameError: name 'datetime' is not defined

如果我尝试直接从Python shell发出相同的语句(importprint),也会发生这种情况。

datetime模块是否应该在我拨打import project的确切时刻自动导入?

提前多多感谢。

2 个答案:

答案 0 :(得分:4)

datetime模块仅导入project命名空间。所以可以project.datetime.datetime.min的形式访问它,但实际上您应该直接将其导入到脚本中。

您在project.py文件中创建的每个符号(名称)(如Project类)最终都在project命名空间中,其中包含从其他模块导入的内容。但这并不像看起来那么低效 - 实际的datetime模块仍然只导入一次,无论你做多少次。每次在第一个之后导入它时,它只是将 names 导入当前命名空间,但实际上并没有完全解读和导入模块。

答案 1 :(得分:0)

尝试将import语句视为大致相当于:

project = __import__('project')

有效地,import语句只是对变量的赋值。加载模块时可能会有一些副作用,但是从脚本内部看到的只是对名称的简单赋值。

您可以使用from project import *从模块中提取所有名称,但不要这样做,因为它会使您的代码更脆弱,更难维护。相反,要么只是导入模块,要么只是导入你想要的名称。

因此对于您的代码类似:

import datetime
from project import Project

是你应该做的事情。