Python Пользовательская сборка с вводом и выводом - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в соревновательном программировании, и я бы попытался сделать собственную сборку в моем Sublime Text 3. Мне нужна сборка, в которой я могу вводить файл и перенаправлять вывод файла в файл.

контент проблема.py:

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

input.in content:

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]*)"
}

Я уверен, что выбрал правильную сборку, на выходе появляется только тест, а в выходной файл ничего не попадает. Я что-то пропустил?

Спасибо!

1 Ответ

1 голос
/ 06 мая 2020

Это невероятно распространенная проблема; В 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 в одной папке, он будет работать так, как вы хотите.

...