在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
答案 0 :(得分:1)
您在链接问题中与问题相反。 -i
使python以交互模式读取脚本(“&gt;&gt;&gt;”和“...”是提示),在交互模式下,您按回车(即输入空白行)退出缩进的部分。链接的问题涉及缩进部分中间的空白行,这使得解释器感到困惑。你有相反的结果:你结束了一个缩进的部分,没有一个空行。在非交互模式下这是完全可以的,但在交互模式下它是禁止的。
解决方案:要么在缩进部分的末尾放置空白行(并且从不在中间),不要告诉解释器以交互模式读取它。我不确定你用-i
标志实际想要完成什么,但请注意python -i test.py
(没有重定向)将以非交互模式运行脚本然后< / em>进入交互模式并从标准输入读取。