无法将标准输入重定向到Python脚本

时间:2016-04-09 12:06:11

标签: python python-3.x

我想将文件重定向为我的Python脚本的标准输入,但是一旦尝试收集输入,我就会收到一些错误。一个简单的MWE将是:

这样的剧本:

T = int(input())

for i in range(T):
    stack = input()

在Window的cmd中有这样的命令:

script.py > someOut.out < someIn.in

我的输入文件将包含以下内容:

[Int]
[String]
[String]
...

它获得了正确的测试次数,但只要它发现了一个字符串,它就会抛出一些异常。例如,对于像

这样的文件
1
kdjddhs

我得到NameError: name 'kdjddhs' is not defined。同时,提交:

1
+-=

抛出:

  File "<string>", line 1
    +-=
      ^
SyntaxError: unexpected EOF while parsing

为什么会这样?当我通过解释器启动脚本时,一切正常。如何以这种方式处理输入,以便我可以通过命令行重定向标准输入,而不是通过脚本本身处理实际的文本文件?

3 个答案:

答案 0 :(得分:1)

首先,它与翻译无关。这里的python版本是有道理的。 如果您使用Python版本2.,上面提到的输入将起作用。如果您使用的是Python 3,则不会。 因为input()函数根据Python版本以不同的方式工作

Python版本2:

  • input() - 阅读输入并评估
  • raw_input() - 将输入读作原始字符串

Python版本3:

  • input() - 在2
  • 中作为raw_input()
  • raw_input() - 没有此功能

如果您使用的是Python 2,那么将输入更改为raw_input。

答案 1 :(得分:1)

你在SheBang上使用了错误的翻译。我已经使用python版本2和3测试了以下代码(注意shebang指定版本):

#!/usr/bin/env python3

import sys
print(sys.version)

T = int(input())

for i in range(T):
    stack = input()
    print(stack)

现在,在python 2上没有任何作用。使用解释器python2 ./test.py < data.in并直接调用文件都会导致错误:

数据:

1
stack-123

输出:

2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2]
Traceback (most recent call last):
  File "./test.py", line 9, in <module>
    stack = input()
  File "<string>", line 1, in <module>
NameError: name 'stack' is not defined

使用python3 python3 ./test.py < data.in./test.py < ./data.in按预期工作。将shebang更改为未指定解释器的#!/usr/bin/env python,使用系统的默认python,在您的情况下是python 2.x并导致错误

我无法真正告诉你为什么python 2不起作用 - 似乎它试图将stack-123评估为一个名为&#34; stack&#34;的变量。并删除-123部分...我将对此进行一些研究,如果我弄明白就更新答案,但使用正确的shebang将解决您的问题。

更新:正如@GurgenHovhannisyan所说(我来的+1),我完全忘记了,在python2中你必须使用raw_input()来实现相同的行为。如果您希望在两个版本中都能使用它,请定义并使用以下函数:

def myInput():
    try:
        # this will fail in python 3
        return raw_input()
    except:
        return input()

希望有所帮助

答案 2 :(得分:1)

对于Python 2.x和Python 3.x,这应该是相同的:

from __future__ import print_function
import sys


stdin_reader = None

# python version check determines our choice of input function
try:
    if (sys.version_info > (3, 0)):
        stdin_reader = input
    else:
        stdin_reader = raw_input
# Yes yes, I know - don't catch all exceptions 
# but here we want to quit if anything fails regardless of the error.
except:
    print("Failed to determine Python version")

def echo_stdin():
    """ Reads stdin and prints it back in upper case """
    r = stdin_reader()
    print(r.upper())

echo_stdin()

输出:

$ python3 echo_stdin.py < data_stdin 
SOME INPUT LALALA
$ python echo_stdin.py < data_stdin 
SOME INPUT LALALA