Python 2 raw_input(): 在WINDOWS 7命令提示符中读取行时出现EOFError

3 投票
2 回答
8040 浏览
提问于 2025-04-17 21:45

注意:关于python的raw_input()在sublime text中有很多相似的问题被提问过。但这个问题不是关于sublime的。这里的python代码是在Windows命令提示符下运行的,这个环境支持交互式输入,而sublime的终端不支持。


我有一个python程序,它使用内置的raw_input()函数来获取用户输入。请看下面的代码。

def password_score():
    pwd = raw_input('Enter a password: ')
    gname = raw_input('Enter your first name: ')
...

我在命令提示符中通过以下方式调用这个程序:

echo password_score()|python -i a06q1.py

其中a06q1.py是文件名。python的目录路径已经临时添加到系统变量%PATH%中。我现在在这个文件所在的目录下。我的操作系统是Windows 7,使用的是python 2.6。之前同样的命令一直都能正常工作。

然后命令提示符返回了:

File "<stdin>", line 1, in <module>
File "a06q1.py", line 27, in password_score
    pwd = raw_input(p_prompt)
EOFError: EOF when reading a line

有没有办法在命令提示符中解决这个问题呢?

编辑:我刚在iOS终端上也试了一下。用和命令提示符一样的命令(带引号),结果返回了同样的错误。我的命令行有什么问题吗?谢谢!


编辑:Sebastian的回答解决了这个问题。命令应该调整为适合Windows的格式,如下所示。

printf "a06q1.password_score()\n'arg1\n'arg2"|python -i -c "import a06q1"

\n后面的单引号可以用空格替换。它们用来分隔多个输入。

2 个回答

1

你想做的事情不是从命令行调用特定函数的正确方法。你需要在代码中加一个 if __name__ == "__main__" 的块。

在你的文件末尾加上:

`if __name__ == "__main__"`:
     password_score()

然后通过以下方式运行程序:

python a06q1.py

当你从命令行运行一个 Python 文件时,__name__ 这个变量会变成 "__main__"。注意,如果你把 a06q1 导入到其他 Python 文件中,__name__ 的值就会变成模块的名字,这样 if __name__ 的块就会返回 False

来自 python 文档

这个模块代表了一个(否则是匿名的)作用域,在这个作用域中,解释器的主程序执行——命令可以从标准输入、脚本文件或交互式提示中读取。就是在这个环境中,典型的“条件脚本”段落被运行。


正如 J.F Sebastian 在评论中所说,你也可以通过提供 -c 选项来执行特定的 Python 命令。以下命令将导入 a06q1 并运行 function_name

python -c "from a06q1 import function_name; function_name()"
1

EOF的意思是没有更多的输入了。确实如此,唯一的那一行已经被-i选项消耗掉了:

$ echo "f()" | python -i -c "def f(): print('x'); input('y\n')"
>>> x
y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in f
EOFError: EOF when reading a line
>>> 

提供更多的输入:

$ printf "f()\n'z'" | python -i -c "def f(): print('x'); print(input('y\n')*3)"
>>> x
y
zzz
>>> 

正如你所说的那样,以这种方式指定要运行的函数是“典型的坏做法”。如果你事先不知道想要运行哪个函数,作为替代方案,你可以这样运行:

$ python -c "from a06q1 import password_score as f; f()" < input_file.txt

撰写回答