You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python input函数在Terminal运行报错求助:字符串输入触发NameError

搞定这个input()报错的问题!

嘿,看你的错误信息NameError: name 'complete' is not defined,我一眼就看出问题出在哪了——你用的是Python 2的解释器,但写的是Python 3的代码!

为啥会出这问题?

你Terminal里调用的/usr/bin/pythonw是系统默认的Python 2解释器,这俩版本的input()函数差别可大了:

  • Python 2里的input()会把你输入的内容当成Python代码执行,你输入complete,它就去找叫complete的变量,找不到就报错。
  • 而你输入数字的程序能跑,是因为输入数字时,Python 2的input()直接把它转成整数了,刚好契合你的代码逻辑。
  • 但Python 3里的input()才是直接读字符串,这也是你本来想要的效果。

先帮你把代码格式理清楚(你原来的代码连换行都没,难怪看着费劲):

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'complete' to end the program. "
message = ""
while message != 'complete':
    message = input(prompt)
    print(message)

这套代码在Python 3里跑完全没问题,但在Python 2里必须把input()换成raw_input()才行。

给你两个解决方案,选哪个都行:

  • 直接用Python 3运行代码:
    在Terminal里把命令里的pythonw换成python3就行,比如:

    cd '/Users/linyang/Desktop/python_work/' && python3 '/Users/linyang/Desktop/python_work/parrot.py'
    

    要是想在Sublime Text里直接跑,就把它的默认解释器改成Python 3,以后就不用每次去Terminal折腾了。

  • 写兼容两个版本的代码:
    要是你需要代码在Python 2和3里都能跑,就在代码最开头加一段兼容代码:

    try:
        input = raw_input
    except NameError:
        pass
    
    prompt = "\nTell me something, and I will repeat it back to you:"
    prompt += "\nEnter 'complete' to end the program. "
    message = ""
    while message != 'complete':
        message = input(prompt)
        print(message)
    

    这段代码的作用是:在Python 2里把input()替换成raw_input(),Python 3里啥也不做,完美兼容。

再说说你的数字程序为啥能跑

你的数字输入程序在Python 2里能运行,其实是个巧合:输入6时,Python 2的input()直接返回整数6,你后面又做了一次int(number)转换,虽然多此一举,但没报错。要是你输入个非数字的内容,比如abc,同样会报错。换成Python 3的话,input()返回字符串,int(number)的转换才是必须的步骤。

内容的提问来源于stack exchange,提问作者Oscar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:08:18