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

带有输入和输出的Python自定义构建,python,input,build,output,sublimetext3,Python,Input,Build,Output,Sublimetext3,我是新的竞争编程,我会尝试做一个自定义建立在我的崇高文本3。我想要一个可以输入文件并将文件输出重定向到文件的构建 problem.py内容: print('test') variable = input() print(variable) 输入内容: word 当我使用以下命令行时,它可以完美地工作: python problem.py <input.in >output.txt 然而,现在我将尝试在SBT3上进行构建 { "cmd": ["C:/ProgramData

我是新的竞争编程,我会尝试做一个自定义建立在我的崇高文本3。我想要一个可以输入文件并将文件输出重定向到文件的构建

problem.py内容:

print('test')
variable = input()
print(variable)
输入内容:

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]*)"
}
我确信选择了正确的构建,输出上只显示test,输出文件中没有任何内容。 我错过什么了吗


谢谢

这是一个非常普遍的问题;互联网上有很多建议说,如果你要创建一个崇高的构建系统,你应该在其中使用cmd来指定执行什么。这是可行的,但在许多情况下,这是更多的工作,并没有做到你期望它

简而言之,当您使用cmd时,您是在告诉Sublime是否看到列表中的第一项?找到它并运行它,然后将列表中的每一项作为该命令的参数提供

如果您只是在做[python,-u,$file]之类的事情,那么它完全满足您的需要;运行Python,告诉它执行一个文件而不执行输出缓冲

当您尝试执行类似于[python,$file,output.txt]的操作时,您实际上是在向python提供一个 重定向输入和输出的构造是您的shell知道如何在windows命令提示符、Linux/MacOS上的bash等操作。为了使用输入重定向,您需要让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不会缓冲它的输出;因为您要将输出发送到文件,所以您肯定需要缓冲

我们还添加了一个选择器,这样Sublime就知道这个构建是针对不需要的Python代码的,但是最好将Tools>build System设置为Automatic,然后构建就可以了

最重要的是,working_dir设置在构建运行时哪个文件夹被视为当前目录。否则,输入文件和输出文件将被假定在硬盘上的某个随机位置,这很可能不是您所期望的


通过将工作目录设置为您正在构建的文件所在的同一目录,您可以确保如果您在同一文件夹中有test.py、input.in和output.txt,它将以您想要的方式工作。

非常感谢!它工作得很好,谢谢你对我下午所做的解释,你救了我一天: