【问题标题】:Syntax error running python in command prompt [duplicate]在命令提示符下运行 python 的语法错误 [重复]
【发布时间】:2017-03-02 00:12:37
【问题描述】:

在 windows 命令提示符下运行 python 时出现此语法错误。

即使我没有输入任何内容并按回车键,它仍然会出现语法错误。我唯一能做的就是 Ctrl+Z 退出。 (退出()不起作用)

命令提示符从一个 bat 脚本启动,该脚本首先设置一堆环境变量,然后启动 cmd。这个 bat 文件是通过 subprocess 或 os.system 从 python gui 调用的(两者都有问题)。

bat文件设置如下:

设置 PYTHONPATH=\some\path

...更多 env var 设置(这是这个“自定义”cmd 的目的

start /D "some/location" "cmd"

如果我通过双击它的罚款直接运行bat文件。

运行 echo %PYTHONPATH% 显示两个启动实例中的所有正确路径(所有其他环境变量相同)

为了方便设置所有环境路径,我想从 python gui 启动它。

有什么想法吗?

【问题讨论】:

  • 你是否对字符编码或终端行为做了什么奇怪的事情?
  • 我不知道。启动过程是 1 行: subprocess.Popen('path\to\bat.bat', shell=True) Bat 如上所述。设置的路径是: PYTHONPATH=myCustomPaths PATH=%PATH%;gitPathForCallingAGit.exe 就是这样为环境。没有碰过别的东西。
  • 你用什么命令来启动 Python?此行为看起来像您使用了 -u 命令行选项,该选项与 Windows 上的标准 REPL 不兼容。它将stdin 置于二进制模式。因此,来自控制台输入的 CRLF 不会被转换为 REPL 所需的 Unix 风格的 LF 行尾。
  • 顺便说一句,根据系统上的速度和可用资源,您正在执行的操作可能会导致临时控制台窗口 (conhost.exe) 令人讨厌地闪烁。使用shell=True 运行带有cmd.exe /c 的命令。这将创建一个控制台(conhost.exe 进程)。您在该 cmd 实例中运行批处理以设置环境,然后在第二个控制台窗口中生成一个新的 shell。那没有必要。如果您使用默认的shell=False 并通过cmd.exe /k 运行批处理,那么您不需要以start 命令结束。您可以在一个 shell 和一个控制台中完成所有操作。
  • 哪个蟒蛇?大声笑第一个python是通过类似的东西运行的:python pythonFile.py。这将启动 GUI。在 GUI 上是一个按钮,它使用子进程运行 bat 文件,它打开一个单独的命令提示符窗口。在此命令提示符下,我通过键入 python 来运行 python。从来不知道或使用过 -u,它是默认打开的选项吗?正如您所提到的,在我看来,这听起来像是一个“行尾”问题。没有注意到任何临时控制台窗口闪烁。奇怪的是,只要我直接双击启动蝙蝠,它就可以正常工作。

标签: python windows batch-file cmd syntax-error


【解决方案1】:

“解决了”它,但并没有为我解释清楚。 @eryksun 为我指明了正确的方向,谢谢!

删除 var PYTHONUNBUFFERED 是为我做的。

set PYTHONUNBUFFERED=

有点明白但不完全......希望删除它不会导致更多问题! :P 这实际上只是一个测试环境,因此实际产品不会以这种方式运行。

Python Interactive Interpreter always returns "Invalid syntax" on Windows

【讨论】:

  • 设置该环境变量与传递-u 命令行选项相同。您可以暂时启用二进制模式以防止损坏通过管道传输到 stdin 的二进制流,但设置它会永久破坏 Windows 上的 REPL。
  • 正确,在这种情况下,它在会话中是临时的。到目前为止,还没有遇到任何问题。我想知道的是 -u 是如何通过的。我没有设置它..
  • 您的意思是PYTHONUNBUFFERED 环境变量是如何设置的?打开一个新的命令提示符并检查set PYTHON 以查看以“PYTHON”开头的所有环境变量的列表。如果已设置,则使用系统环境变量编辑器将其删除。
  • 是的,我知道如何删除它作为我上面的解决方案。此行在 cmd 启动后的运行时发生(实际上是在行中)。但是我想知道更多为什么它首先被设置,为什么只在这种启动方法中(即从另一个 python 解释器)。如果直接启动(通过双击蝙蝠)没有问题。
  • 如果您没有在系统环境变量编辑器中看到PYTHONBUFFERED 定义,那么您的 pythonFile 脚本可能正在设置它。您可以将自定义环境传递给 Popen 调用。例如,原始环境为nt.environ。您可以复制它,例如environ = nt.environ.copy(),然后修改副本,例如if 'PYTHONBUFFERED' in environ: del environ['PYTHONBUFFERED']。然后运行subprocess.Popen(r'cmd.exe /k "path\to\bat.bat"', env=environ)
猜你喜欢
  • 2019-11-13
  • 2023-03-25
  • 2017-08-22
  • 2011-08-12
  • 2016-11-09
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多