这是一个非常普遍的问题;互联网上有很多建议说,如果你正在创建一个sublime-build 系统,你应该在其中使用cmd 来指定要执行的内容。这行得通,但在许多情况下,它的工作量更大,并没有达到您的预期。
简而言之,当您使用cmd 时,您是在告诉 Sublime “看到列表中的第一项?找到并运行它,然后将列表中的所有其他项作为该命令的参数提供”。
如果你只是在做类似["python", "-u", "$file"] 的事情,那正是你想要的;运行 Python,告诉它执行一个文件而不做输出缓冲。
当您尝试执行 ["python", "$file", "< input.txt", "> output.txt"] 之类的操作时,您实际上是在向 Python 提供 "< input.txt" 的参数,而 Python 无法理解。
重定向输入和输出的构造是你的 shell 知道如何做的事情(windows 命令提示符,bash 在 Linux/MacOS 上,等等)。为了使用输入重定向,您需要让 shell 执行程序,以便它可以为您执行重定向。
幸运的是,这就像使用shell_cmd 代替cmd 一样简单;将您提供的字符串直接传递给系统用于执行的任何 shell。
在你的情况下,看起来像这样:
{
"shell_cmd": "C:/ProgramData/Anaconda3/python.exe \"$file\" < input.in > output.txt",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"working_dir": "$file_path",
"env": {"PYTHONIOENCODING": "utf-8"}
}
shell_cmd 是您在 shell 中键入的内容的副本,您可以在其中手动执行命令;在这里,我们删除了-u,因为这使得 Python 不会缓冲它的输出;由于您要将输出发送到文件,因此您肯定需要缓冲。
我们还添加了selector,以便 Sublime 知道此构建是针对 Python 代码的(不需要,但最好将 Tools > Build System 设置为 Automatic,然后构建“Just Work”)。
最重要的是,working_dir 设置在构建运行时将哪个文件夹视为“当前”目录。如果没有这个,输入文件和输出文件将被假定在您的硬盘驱动器上的某个随机位置,这很可能不是您所期望的。
通过将工作目录设置为与您正在构建的文件所在的目录相同,您可以确定如果您在同一文件夹中有 test.py、input.in 和 output.txt,它会运行以你想要的方式工作。