【问题标题】:Python 2 raw_input() : EOFError when reading a line in WINDOWS 7 command promptPython 2 raw_input():在 WINDOWS 7 命令提示符下读取一行时出现 EOFError
【发布时间】:2014-03-11 05:58:35
【问题描述】:

注意:在 sublime text 中,很多关于 python raw_input() 的问题都被问到了。这个问题不是关于崇高的。 python 代码在 Windows 命令提示符下调用,与 sublime 终端不同,它支持交互式输入。


我有一个 python 程序,它使用内置函数 raw_input() 接受用户输入。见下文。

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

我在cmd中调用程序是通过

echo password_score()|python -i a06q1.py

其中 a06q1.py 是文件名。 python目录的路径已暂时添加到系统变量%PATH%中。我在文件的目录中。我的操作系统是 Windows 7。我使用的是 python 2.6。到目前为止,相同的命令一直有效。

然后cmd返回

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

有没有办法绕过它在 cmd 内

编辑:我也刚刚在 iOS 终端上尝试过。使用与 cmd 中相同的命令(带引号),它返回相同的错误。我使用的命令行有什么问题吗?谢谢!


编辑:塞巴斯蒂安的回答解决了这个问题。该命令应如下适应窗口。

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

\n 后面的单引号可以用空格代替。它们将多个输入分开。

【问题讨论】:

  • 尝试用python shell运行代码,或者用idle。
  • 我只将 shell(再次在 cmd 中)用于单个功能。请问如何在 shell 中运行程序?
  • 等等。 password_scorea06q1.py 内部的函数吗?然后你想称它为将函数名通过管道传递到脚本中?
  • 是吗?这真的很糟糕吗?
  • 如果你安装了idle,你可能想从那里运行它,它将在python shell中运行

标签: python windows cmd raw-input


【解决方案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

【讨论】:

  • IC。我需要在命令中传递参数。谢谢你。然而,还有一个问题。我必须做的任务实际上要求多个 raw_input()。我将如何处理? (\n 不足以将它们分开。)
  • @Argyll:每个raw_input() 都需要在输入中换行。如果 Windows 上没有 printf 实用程序,则只需将输入写入文件并在命令行中提供,例如 python -c "from a06q1 import password_score as f; f()" &lt; input_file.txt
  • 有。并且 printf 工作,除了它将所有行一起视为单个字符串。我想知道您是否知道解决方法?
  • @Argyll:你可以试试\r\n。如果你只运行printf "a\nb",你会看到什么?
  • printf 有效。但是,当输入多个参数时,\n 必须后跟 ',但在 cmd 中不能以 ' 开头。 (可能还有其他可用的语法)我将其添加到您的答案中。
【解决方案2】:

您尝试做的不是从命令行调用特定函数的方式。 你的代码中需要一个if __name__ == "__main__"-block。

在文件末尾:

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

现在运行程序:

python a06q1.py

如果您从命令文件运行 python 文件,__name__-变量将为"__main__"。请注意,如果您将a06q1 导入到其他python 文件,则名称将等于模块名称,因此if __name__ 块的计算结果为False

来自python docs

此模块表示(否则为匿名的)范围,其中 解释器的主程序执行——命令从 标准输入,来自脚本文件,或来自交互式提示。它 在这个环境中,惯用的“条件脚本”节 正在运行


正如 J.F Sebastian 在 cmets 中所写,您还可以通过提供 -c 开关来执行特定的 python 命令。以下将导入a06q1 并运行function_name

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

【讨论】:

  • 欣赏它。虽然如果我在编写程序时不知道要调用哪个函数怎么办?过去,这对我来说非常频繁。
  • @Argyll: python -c "from a06q1 import whatever; whatever()"
  • @Sebastian:由于各种原因出现了大量错误。例如,程序中的打印无法以某种方式工作。它抱怨我在顶部程序中包含的另一个文件。等等等等
  • @Argyll 如果您的程序打算从命令行运行,您可以查看argparse。但是对于开发,如果你想运行另一个函数,只需更改 if 块中的函数。你可以评估 sys.argv 的内容,但这听起来有风险。
  • @Argyll: whatever() 不是真正的函数名。您应该提供与 a06q1 模块中的函数对应的名称。此外,确保导入 a06q1 不会运行任何不必要的代码,例如,将其移至 main() 函数并仅在文件作为脚本执行时调用它:if __name__ == "__main__": main()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多