重定向到stdin时,正确的python脚本中的语法错误

时间:2016-10-20 23:08:40

标签: python django bash shell indentation

在Ubuntu Linux和Python 2.7.6上使用bash shell,如果我使用命令运行下面的python脚本,

python test.py

我得到了这个输出:

outer
inner
2

相反,如果我使用这样的stdin重定向,

python -i < test.py

输出是,

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

所以,显然,我不应该在shell重定向中使用-i选项,即使用'&lt;'命令中的字符。这种组合显然会导致对空格的一些操作,当python解析输入时,这是一个python语法错误。

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

此外,我相信这可以在同一个Linux机器上的不同Linux机器上运行,所以我想知道是否有一些环境设置可以修复它。

有没有办法改变python的交互模式的行为,或者有没有办法在Django shell中禁用交互模式,这样我就可以运行一般的python脚本而不会出现错误的语法错误?或者我只是在Django或python中遇到错误?

顺便提一下,这个问题听起来非常像https://stackoverflow.com/a/13703413/2950621中描述的问题,但接受的答案是改变脚本中的空行。然而我的剧本没有空行。

接下来是python脚本。 (当没有执行缩进行时,我写了它来标记):

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

1 个答案:

答案 0 :(得分:1)

您在链接问题中与问题相反。 -i使python以交互模式读取脚本(“&gt;&gt;&gt;”和“...”是提示),在交互模式下,您按回车(即输入空白行)退出缩进的部分。链接的问题涉及缩进部分中间的空白行,这使得解释器感到困惑。你有相反的结果:你结束了一个缩进的部分,没有一个空行。在非交互模式下这是完全可以的,但在交互模式下它是禁止的。

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