重定向到标准输入时正确的 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
(没有重定向)将 运行 非交互模式下的脚本 然后进入交互模式并从标准输入读取。
在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
(没有重定向)将 运行 非交互模式下的脚本 然后进入交互模式并从标准输入读取。