我遇到了一个非常混乱的问题。 无论我在Python解释器中input什么,都会返回“Invalid Syntax”。 看下面的例子。 我已经试过用提示符运行解释器的代码页,但似乎没有任何帮助。
此外,我还没有能够find这个特殊的,在网上其他地方怪异的错误。
任何人可以提供的援助将是可爱的。 我已经尝试重新安装Python,但我没有任何运气 – 在3.13和2.7中也存在问题。
运行:Python版本3.1.3,Windows XP SP3。
获得:
C:\Program Files\Python31>.\python Python 3.1.3 (r313:86834, Nov 27 2010, 18:30:53) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> 2+2 File "<stdin>", line 1 2+2 ^ SyntaxError: invalid syntax >>> x = "Oh, fiddlesticks." File "<stdin>", line 1 x = "Oh, fiddlesticks." ^ SyntaxError: invalid syntax
当以交互方式运行Python并且无缓冲区时,有一个已知的问题,它将在3.2版中进行修复 – 并且可能会被反向移植到旧版本,请参阅http://bugs.python.org/issue11098
令人讨厌的是,人们可能会在没有意识到的情况下使用无缓冲的I / O。 在我的情况下(Python 2.5.4(r254:67916)),我前一段时间设置了一个环境变量,使得Python 始终运行无缓冲(在Windows上,这是PYTHONUNBUFFERED = YES,或者任何非空字符串替换为YES ),然后忘了它。 删除env.var。 为我解决了这个问题。
因此,检查这个环境变量可能是值得的。 它没有默认设置。
现在样品已经被清理出来了,问题是线路终端。
这不是一个解决方案,但是如果你创建一个包含这个代码的文件t.py
,运行它,然后键入一些文本,会发生什么?
import sys; print(repr(sys.stdin.readline()))
如果你输入类似2+2
东西,那么运气好的话,这会告诉你Python解释器在你的例子中得到了什么,反过来可能会给出一些线索。
您也可以在命令提示符下尝试:
python -c "import sys; print(repr(sys.stdin.readline()))"
这将允许您键入一行并显示该行的详细信息。
有一次,像2002年那样,我设法构建了一个无法在Windows下运行的Python版本。 它会给出这样的语法错误,指向行的末尾。 在这种情况下,我发现这种情况不太可能是个问题,尤其是在您使用Windows安装的情况下。
我也有类似的问题,当我不经意间使用不间断的空格,而不是空格,但我不明白这是怎么会发生的提示,除了你2 + 2的例子不使用空格或引号也可以是个问题。
你使用什么编码和键盘设置?
这是一个担心:
C:\Program Files\Python31>.\python
运行当前目录设置为软件安装目录的软件永远不是一个好主意。 您有冒险创建干扰软件运行的文件。 当你开始发现错误和怪异行为时,随之而来的颠簸可能会使情况完全失去控制。
这个更好:
C:\ somewhere_else_with_no_spaces>“c:\ program files \ python31 \ python”
最好的是保持它“程序文件”。 除非我误解,否则建议的安装文件夹应该是C:\Python31
,这很好,因为无论何时使用“程序文件”,都不需要引号。 在“程序文件”中有AFAIK没有好的理由有软件。
一些诊断:
A.打开命令提示符窗口。
B.输入: dir "c:\program files\python31"
C.复制/粘贴步骤B的结果到你的问题的编辑,即不要把它放在评论。
如果你回答(在编辑你的问题时)有人问到有关键盘宏的问题,这将有所帮助,也考虑到了过度智能键盘的可能性,以及具有多个IME而不使用“正确”键盘的可能性。 另外,这种行为是否发生在Python以外的任何软件?
即使它可能和你不一样,但我也面临同样的问题,但是有另一种诊断方法,你应该总是建立一个历史文件。
我通过vim
找出了历史文件的原因(或者你也可以考虑使用hexdump -C
,以防vim
不显示隐藏字符):
根据http://www.w3.org/International/questions/qa-bidi-controls :
RLM和LRM字符
Unicode提供的另外两个不可见但非嵌入的方向控制字符通常不具有相应的标记,应该以字符或转义形式使用。 请注意,它们的问题较少,因为它们是单独使用的,而不是像我们讨论过的其他控制字符一样成对地划分文本范围。
U+200E: LEFT-TO-RIGHT MARK U+200F: RIGHT-TO-LEFT MARK
原因是因为我直接复制/粘贴在线代码(我知道这是危险的安全,虽然)包含隐藏的RLM和LRM字符。