重定向到标准输入时正确的 python 脚本中出现语法错误

Syntax error in a correct python script when redirected to stdin

在UbuntuLinux和Python2.7.6上使用bashshell,如果我运行python 下面的脚本和命令,

python test.py

我得到这个输出:

outer
inner
2

如果我改为像这样使用标准输入的重定向,

python -i < test.py

输出是,

>>> outer
>>> >>> ... ... ...   File "<stdin>", line 4
    print i
        ^
SyntaxError: invalid syntax
>>> 

所以,很明显,我不应该将 -i 选项与 shell 重定向一起使用,即在命令中使用“<”字符。这种组合显然导致了对白色 space 的一些操作,当 python 解析输入时,这是一个 python 语法错误。

不幸的是,当 运行ning python Django python 脚本 shell 和命令 [=64] 时,我 运行 遇到了同样的问题=] Django python shell 无法禁用交互式 python 模式,也无法传递 python 脚本文件的名称。

此外,我相信这适用于不同的 Linux 框或更早的相同 Linux 框,所以我想知道是否有一些环境设置可以修复它。

有没有办法改变 python 交互模式的行为,或者有没有办法在 Django shell 中禁用交互模式,这样我就可以 运行 一般 python 没有虚假语法错误的脚本?或者我只是遭受了 Django 或 python 中的错误?

顺便说一句,这个问题听起来很像 中描述的问题,但接受的答案是更改脚本中的空行。然而我的脚本没有空行。

python 脚本如下。 (缩进行不执行的时候我写的是flag):

print 'outer'
i = 1
if True:
 print 'inner'
 i = 2
print i

我想有些读者可能会怀疑隐藏的角色是罪魁祸首。这是八进制转储,因此您可以看到除了上面看到的内容之外什么都没有(甚至没有制表符):

$ od -a test.py
0000000   p   r   i   n   t  sp   '   o   u   t   e   r   '  nl   i  sp
0000020   =  sp   1  nl   i   f  sp   T   r   u   e   :  nl  sp   p   r
0000040   i   n   t  sp   '   i   n   n   e   r   '  nl  sp   i  sp   =
0000060  sp   2  nl   p   r   i   n   t  sp   i  nl

您遇到的问题与链接问题中的相反。 -i 使 python 以交互模式读取脚本(“>>>”和“...”是提示),在交互模式下,您按 return(即输入空行)退出缩进部分。链接的问题涉及缩进部分中间的空行,这让口译员感到困惑。你有相反的情况:你结束一个缩进部分 而没有 一个空行。这在非交互模式下完全没问题,但在交互模式下就不行了。

解决方案:要么将空行放在缩进部分的末尾(绝不能放在中间),要么不要告诉解释器以交互模式阅读它。我不确定你实际上想用 -i 标志完成什么,但请注意 python -i test.py (没有重定向)将 运行 非交互模式下的脚本 然后进入交互模式并从标准输入读取。