Python 带有输入和输出的自定义构建

Python Custom Build with input and output

我是竞争性编程的新手,我会尝试在我的 Sublime Text 3 中进行自定义构建。我想要一个可以输入文件并将文件输出重定向到文件的构建。

problem.py内容:

print('test')
variable = input()
print(variable)

input.in内容:

word

当我使用以下命令行时,它工作得很好:

python problem.py <input.in >output.txt

但是现在我会尝试在 SBT3 上进行构建

{
    "cmd": ["C:/ProgramData/Anaconda3/python.exe", "-u", "$file", " <input.in", " >output.txt"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)"
}

我确信 select 构建正确,只有测试出现在输出中,输出文件中没有任何内容。 我错过了什么吗?

谢谢!

这是一个非常普遍的问题;网上流传着很多建议,如果您正在创建一个 sublime-build 系统,您应该在其中使用 cmd 来指定要执行的内容。这行得通,但在许多情况下,它的工作量更大,并且无法达到您的预期。

简而言之shell,当您使用 cmd 时,您是在告诉 Sublime "See the first item in the list? Find that and run it, and then provide every other item in the list as arguments to that command"。

如果您只是在做类似 ["python", "-u", "$file"] 的事情,而这正是您想要的; 运行 Python,告诉它执行一个文件而不做输出缓冲。

当您尝试执行类似 ["python", "$file", "< input.txt", "> output.txt"] 的操作时,您实际上是在向 Python 提供一个参数 "< input.txt",它无法理解。

重定向输入和输出的构造是您的 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 设置在构建 运行ning 时哪个文件夹被视为 "current" 目录。如果没有这个,输入文件和输出文件将被假定位于硬盘驱动器上的某个随机位置,这很可能不是您所期望的。

通过将工作目录设置为您正在构建的文件所在的同一目录,您可以确定如果您有 test.pyinput.inoutput.txt 在同一个文件夹中,它会按照你想要的方式工作。