Python 2 raw_input(): 在WINDOWS 7命令提示符中读取行时出现EOFError
注意:关于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 个回答
你想做的事情不是从命令行调用特定函数的正确方法。你需要在代码中加一个 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()"
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