Python:"全局名称'time'未定义"

30

我正在用Python为一个朋友写一个有趣的程序,它会打印出"We are the knights who say 'Ni'!"这句话,然后暂停3秒钟,最后使用random模块的uniform()方法,在随机时间间隔内连续打印"Ni!" 20次。以下是我的代码:

from time import sleep
import random

def knights_of_ni():
    generator = random.Random()
    print "We are the knights who say 'ni'."
    sleep(3)
    for i in range(0,20):
        print "Ni!"
        sleep(generator.uniform(0,2))

我尝试在解释器中输入from silly import knights_of_ni()import silly导入这个模块,然后使用knights_of_ni()silly.knights_of_ni()调用该函数(分别),但我总是得到相同的异常:

 NameError: global name 'time' is not defined

这个错误是什么原因导致的?我该怎么修改我的代码呢?

编辑:坦白地说,我也不确定我当时遇到了什么问题。第二天早上我运行了代码,发现它完全没有问题。我发誓昨晚代码确实出现了错误……无论如何,感谢你的建议。


1
非常重要的是,你需要退一步并正确理解import的工作原理。否则,你将浪费大量时间随意更改代码,试图让它正常工作。也许你应该问一个关于你不理解import的问题。 - John La Rooy
2
@gnibbler:我完全理解import命令,你可以使用import spam来获取一个完整的模块,然后调用每个函数,如spam.eggs(),而你可以使用from spam import eggs来获取特定的函数和spam命名空间,这样你就可以调用函数eggs() - Rafe Kettler
8个回答

57

那是不可能的。你的代码示例与产生该错误的代码不同。

也许你使用了 time.sleep(..) 而不是 sleep(..)。你已经使用了 from time import sleep。若要使用 time.sleep(..) 形式,必须执行 import time


是的,我不知道发生了什么事,我确定这段代码昨晚出现了错误,但无论如何,现在它可以工作了...谢谢你说服我再次尝试运行它。 - Rafe Kettler
实际上,我知道发生了什么...... 我在解释器中使用了一些 time 相关的东西,当我调用 knights_of_ni 时它可能会变得混乱。 - Rafe Kettler
3
6年后,我收到了相同的错误信息。而且这正是我所犯的确切错误。 - SauceCode

5
下面这两段代码都可以正常工作:
import time

time.sleep(3)

from time import sleep

sleep(3)

2

抱歉,虽然这是一个旧帖子,但我也遇到了类似的问题。

我在 Apache 和 Python 下使用 mod_python 运行time.time()。如果我尝试加载包含 time.time() 的页面,它会报错:“全局名称 'time' 未定义”。但是,如果我通过 SSH 登录到我的 Web 服务器,并从命令行运行完全相同的方法,则可以正常工作。

最终,重启 Apache2 服务解决了此问题。我不确定为什么会有所帮助。我猜测该模块在某个时刻被卸载,然后无法重新加载,尽管已导入时间命令。

这很奇怪而且有点神秘。很抱歉我没有找到实际原因,但希望这可以帮助下一个人。


2
将函数导入另一个文件并在调用之前,您只会导入该函数的内容。该文件顶部的导入不会被导入到其他文件中。您应该将两个导入都放入函数中,使其如下所示:
def knights_of_ni():
    from time import sleep
    import random
    <the function contents>

这将验证您想要导入的内容是否在调用函数的位置可用。不必担心重复导入,因为Python不允许这样做——如果在导入此函数的文件中导入了time,则不会重新导入。


0

就像Jerub所说的那样。我运行了您的精确代码,并且它运行正常:

>>> import silly
>>> silly.knights_of_ni()
We are the knights who say 'ni'.
Ni!
Ni!
Ni!
Ni!
Ni!
Ni!

0

我找到答案了!我之前也遇到过同样的问题,只需要重新启动Canopy就可以了。虽然我不是很擅长Python或者理解计算机,但我的程序认为我仍然在某个地方调用了“time”,即使它不在代码中。


0

我在使用Jupyter Notebook时遇到了同样的错误,当时有些代码正在后台线程上运行。删除自动重载/在线程运行时不更改文件可以解决这个问题。


0
如果你想使用 time.sleep(n) 函数,那么你首先需要添加一个导入语句: import time

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