Это невероятно распространенная проблема; В inte rnet есть множество советов, в которых говорится, что если вы создаете систему sublime-build
, вы должны использовать в ней cmd
, чтобы указать, что будет выполняться. Это работает, но во многих случаях это больше работы и не делает того, что вы ожидаете.
Короче говоря, когда вы используете cmd
, вы говорите Sublime: «См. Первый элемент в список? Найдите его и запустите, а затем укажите каждый другой элемент в списке в качестве аргументов этой команды ».
Если вы просто делаете что-то вроде ["python", "-u", "$file"]
, это делает именно то, что вы хотите; запустите Python, скажите ему выполнить файл без буферизации вывода.
Когда вы пытаетесь сделать что-то вроде ["python", "$file", "< input.txt", "> output.txt"]
, вы буквально предоставляете аргумент от "< input.txt"
до Python, который он не понимает.
Конструкция перенаправления ввода и вывода - это то, что ваша оболочка знает, как это сделать (windows командная строка, bash
в Linux / MacOS, c). Чтобы использовать перенаправление ввода, вам нужно, чтобы оболочка выполняла программу, чтобы она могла выполнять перенаправление за вас.
К счастью, это так же просто, как использовать shell_cmd
вместо cmd
; который передает строку, которую вы предоставляете напрямую, в любую оболочку, которую система использует для выполнения.
В вашем случае это будет выглядеть так:
{
"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
является копией именно то, что вы набираете в оболочке, где вы выполняете команду вручную; здесь мы удалили -u
, потому что это делает Python не буферизующим вывод; поскольку вы отправляете вывод в файл, вам определенно нужна буферизация.
Мы также добавляем selector
, чтобы Sublime знал, что эта сборка предназначена для кода Python (не требуется, но это приятно чтобы установить Tools > Build System
на Automatic
, а затем построить «Just Work»).
Самое главное, working_dir
устанавливает, какая папка будет считаться «текущей» директорией во время выполнения сборки. Без этого предполагается, что входной и выходной файл находятся в каком-то случайном месте на вашем жестком диске, что, скорее всего, не то, что вы ожидаете.
Установив рабочий каталог в тот же каталог, что и файл Вы можете быть уверены, что если у вас есть test.py
, input.in
и output.txt
в одной папке, он будет работать так, как вы хотите.