- Объекты stdin, stdout, stderr модуля sys в Python.
- Файловые объекты интерпретатора для стандартного ввода, вывода.
- Синтаксис:
- Описание:
- sys.__stdin__ , sys.__stdout__ , sys.__stderr__ :
- Примеры использования sys.stdout , sys.stdin :
- Запись в файл того, что выводится на консоли (лог консоли).
- Пример печати текста в консоль с задержкой.
- /* steve jansen */
- // another day in paradise hacking code and more
- Windows Batch Scripting: Stdin, Stdout, Stderr
- File Numbers
- Redirection
- Suppressing Program Output
- Redirecting Program Output As Input to Another Program
- A Cool Party Trick
- Comments
- Guides
- Recent Posts
- Social Stuff
- stdin, stdout, stderr stdin, stdout, stderr
- Синтаксис Syntax
- Remarks Remarks
- Python — stdin, stdout и stderr
- 1. sys.stdin
- 2. sys.stdout
- 3. sys.stderr
- Перенаправление в файл
- STDIN, STDOUT not streaming correct output when used with pipe in windows
- 1 Answer 1
Объекты stdin, stdout, stderr модуля sys в Python.
Файловые объекты интерпретатора для стандартного ввода, вывода.
Синтаксис:
Описание:
Файловые объекты sys.stdin , sys.stdout и sys.stderr используются интерпретатором для стандартного ввода, вывода и ошибок:
- sys.stdin — используется для всех интерактивных входных данных, включая вызовы input() ;
- sys.stdout — используется для вывода оператором print() и выражений, которые возвращают значение, а также для подсказок input() ;
- sys.stderr — сообщения об ошибках и собственные запросы переводчика.
Эти потоки являются обычными текстовыми файлами, такими же, как и те, которые возвращаются функцией open() .
Их параметры выбираются следующим образом:
Кодировка символов зависит от платформы. Не-Windows платформы используют кодировку локали locale.getpreferredencoding() .
В Windows UTF-8 используется для консольного устройства. Не символьные устройства, такие как дисковые файлы и каналы, используют кодировку языкового стандарта системы, то есть кодовую страницу ANSI. Не консольные символьные устройства, такие как NUL , т.е. где метод isatty() возвращает True , используют значение кодовых страниц ввода и вывода консоли при запуске соответственно для sys.stdin и sys.stdout / sys.stderr . По умолчанию используется системная кодировка локали, если процесс изначально не подключен к консоли.
Особое поведение консоли можно изменить, установив переменную окружения PYTHONLEGACYWINDOWSSTDIO перед запуском Python. В этом случае кодовые страницы консоли используются как для любого другого символьного устройства.
На всех платформах можно переопределить кодировку символов, установив переменную среды PYTHONIOENCODING перед запуском Python или используя новый параметр командной строки — X utf8 и переменную среды PYTHONUTF8 . Однако для консоли Windows это применимо только в том случае, если также установлено PYTHONLEGACYWINDOWSSTDIO .
В интерактивном режиме потоки stdout и stderr буферизуются по строкам. В противном случае они буферизируются как обычные текстовые файлы. Вы можете переопределить это значение с помощью параметра командной строки -u .
Примечание. Для записи или чтения двоичных данных из/в стандартные потоки используйте базовый объект двоичного буфера. Например, чтобы записать байты в sys.stdout используйте sys.stdout.buffer.write(b’abc’) .
Однако, если вы пишете модуль или библиотеку и не контролируете, в каком контексте будет выполняться ее код, помните, что стандартные потоки могут быть заменены файловыми объектами, такими как io.StringIO , которые не поддерживают атрибут буфера.
Изменено в Python 3.9: не интерактивный sys.stderr теперь буферизуется по строкам, а не полностью.
sys.__stdin__ ,
sys.__stdout__ ,
sys.__stderr__ :
Эти объекты содержат исходные значения sys.stdin , sys.stderr и sys.stdout . Они используются во время финализации и могут быть полезны для печати в реальном стандартном потоке, независимо от того, был ли перенаправлен объект sys.std* .
Его также можно использовать для восстановления реальных файлов в известные рабочие файловые объекты, если они были перезаписаны поврежденным объектом. Однако предпочтительный способ сделать это — явно сохранить предыдущий поток перед его заменой и восстановить сохраненный объект.
Примечание. При некоторых условиях sys.stdin , sys.stderr и sys.stdout , а также исходные значения sys.__stdin__ , sys.__stdout__ и sys.__stderr__ могут быть None . Обычно это относится к приложениям с графическим интерфейсом Windows, которые не подключены к консоли, а приложения Python запускаются с pythonw.exe (1) .
Примеры использования sys.stdout , sys.stdin :
Запись в файл того, что выводится на консоли (лог консоли).
Этот код ничего не выводит на консоль, но записывает «Hello World» в текстовый файл с именем file.txt .
Чтобы сделать такие вещи менее подверженными ошибкам, Python предоставляет sys.__stdin__ , sys.__stdout__ и sys.__stderr__ которые всегда содержат исходные значения sys.stdin , sys.stdout и sys.stderr . Приведенный выше код можно было бы сделать проще, используя sys.__stdout__ :
Причина, по которой Python имеет как sys.stdout , так и sys.__stdout__ в основном заключается в удобстве, поэтому вам не нужно создавать переменную для копирования stdout = sys.stdout
Пример печати текста в консоль с задержкой.
Определим функцию печати в консоль с задержкой так, что бы ее можно было использовать вместо встроенной функции print() .
/* steve jansen */
// another day in paradise hacking code and more
Windows Batch Scripting: Stdin, Stdout, Stderr
DOS, like Unix/Linux, uses the three universal “files” for keyboard input, printing text on the screen, and the printing errors on the screen. The “Standard In” file, known as stdin, contains the input to the program/script. The “Standard Out” file, known as stdout, is used to write output for display on the screen. Finally, the “Standard Err” file, known as stderr, contains any error messages for display on the screen.
File Numbers
Each of these three standard files, otherwise known as the standard streams, are referernced using the numbers 0, 1, and 2. Stdin is file 0, stdout is file 1, and stderr is file 2.
Redirection
A very common task in batch files is sending the output of a program to a log file. The > operator sends, or redirects, stdout or stderr to another file. For example, you can write a listing of the current directory to a text file:
The > operator will overwrite the contents of temp.txt with stdout from the DIR command. The >> operator is a slight variant that appends the output to a target file, rather than overwriting the target file.
A common technique is to use > to create/overwrite a log file, then use >> subsequently to append to the log file.
By default, the > and >> operators redirect stdout. You can redirect stderr by using the file number 2 in front of the operator:
You can even combine the stdout and stderr streams using the file number and the & prefix:
This is useful if you want to write both stdout and stderr to a single log file.
To use the contents of a file as the input to a program, instead of typing the input from the keyboard, use the operator.
Suppressing Program Output
The pseudofile NUL is used to discard any output from a program. Here is an example of emulating the Unix command sleep by calling ping against the loopback address. We redirect stdout to the NUL device to avoid printing the output on the command prompt screen.
Redirecting Program Output As Input to Another Program
Let’s say you want to chain together the output of one program as input to another. This is known as “piping” output to another program, and not suprisingly we use the pipe character | to get the job done. We’ll sort the output of the DIR commmand.
A Cool Party Trick
You can quickly create a new text file, say maybe a batch script, from just the command line by redirecting the command prompt’s own stdin, called CON , to a text file. When you are done typing, hit CTRL+Z , which sends the end-of-file (EOF) character.
There are a number of other special files on DOS that you can redirect, however, most are a bit dated like like LPT1 for parallel portt printers or COM1 for serial devices like modems.
Posted by Steve Jansen Mar 1 st , 2013 batch, scripting, shell, windows
Comments
Hi, I’m Steve. I’m a software developer loving life in Charlotte, NC, an (ISC) 2 CSSLP and an avid fan of Crossfit.
And, no, I’m not Steve Jansen the British jazz drummer, though that does sound like a sweet career.
Guides
Recent Posts
Social Stuff
- @steve-jansen on GitHub
- @steve-jansen on StackOverflow
- @steve-jansen ProTips on Coderwall
- @steve-jansen on Microsft Connect
- @steve-jansen on ASP.NET User Voice
- Subscribe via RSS
Copyright © 2015 — Steve Jansen — Powered by Octopress
stdin, stdout, stderr stdin, stdout, stderr
Синтаксис Syntax
Remarks Remarks
Это стандартные потоки для ввода, вывода и вывода ошибок. These are standard streams for input, output, and error output.
По умолчанию стандартный ввод — чтение с клавиатуры, в то время как стандартный вывод и стандартный вывод ошибок печатаются на экране. By default, standard input is read from the keyboard, while standard output and standard error are printed to the screen.
Следующие указатели потока доступны для получения стандартных потоков: The following stream pointers are available to access the standard streams:
Указатель Pointer | Поток Stream |
---|---|
stdin | Стандартный ввод Standard input |
stdout | Стандартные выходные данные Standard output |
stderr | Стандартная ошибка Standard error |
Эти указатели можно использовать в качестве аргументов для функций. These pointers can be used as arguments to functions. Некоторые функции, например getchar и putchar, используют stdin и stdout автоматически. Some functions, such as getchar and putchar, use stdin and stdout automatically.
Эти указатели являются константами, и им не могут быть присвоены новые значения. These pointers are constants, and cannot be assigned new values. Функцию freopen можно использовать, чтобы перенаправить потоки в файлы на диске или на другие устройства. The freopen function can be used to redirect the streams to disk files or to other devices. Операционная система позволяет перенаправлять стандартный ввод и вывод программы на командном уровне. The operating system allows you to redirect a program’s standard input and output at the command level.
Python — stdin, stdout и stderr
Прежде чем читать эту статью, давайте разберемся, что такое термины stdin , stdout и stderr .
Стандартный ввод — это дескриптор файла, который пользовательская программа читает, чтобы получить информацию от пользователя. Мы передаем ввод на стандартный ввод (stdin).
Стандартный вывод — программа пользователя записывает обычную информацию в этот дескриптор файла. Вывод возвращается через стандартный вывод (stdout).
Стандартная ошибка — программа пользователя записывает информацию об ошибке в этот дескриптор файла. Ошибки возвращаются через стандартную ошибку (stderr).
Python предоставляет нам файловые объекты, представляющие stdin, stdout и stderr. Давайте посмотрим, как мы могли бы работать с этими объектами, чтобы использовать ввод и вывод программы.
1. sys.stdin
Модуль Python sys предоставляет нам все три файловых объекта для stdin, stdout и stderr. В качестве объекта входного файла мы используем sys.stdin . Это похоже на файл, где вы можете открывать и закрывать его, как и любые другие файлы в Python.
Давайте разберемся на простом примере:
Выше фрагмент кода продолжает чтение входных данных из stdin и выводит сообщение на консоли ( stdout ) до тех пор , слово exit не встречаются.
Примечание. Обычно мы не закрываем объект файла stdin по умолчанию, хотя это разрешено. Итак, stdin_fileno.close() — допустимый код Python.
Теперь, когда мы немного знаем о stdin , перейдем к stdout .
2. sys.stdout
В качестве объекта выходного файла мы используем sys.stdout . Он похож на sys.stdin , но напрямую отображает все, что написано в нем, в консоли.
В приведенном ниже фрагменте показано, что мы получаем вывод в консоль, если пишем в sys.stdout .
3. sys.stderr
Это похоже на sys.stdout потому что он также sys.stdout непосредственно выводит в консоль. Но разница в том, что он печатает только сообщения об исключениях и ошибках. (Вот почему он называется стандартной ошибкой).
Проиллюстрируем это на примере.
Как вы можете заметить, для всех входных строк мы пытаемся добавить к Integer, что вызовет исключение. Мы перехватываем все такие исключения и печатаем еще одно сообщение отладки с помощью sys.stderr .
Перенаправление в файл
Мы можем перенаправить дескрипторы файлов stdin , stdout и stderr в любой другой файл (дескриптор файла). Это может быть полезно, если вы хотите регистрировать события в файле без использования какого-либо другого модуля, такого как Logging.
Приведенный ниже фрагмент перенаправляет вывод ( stdout ) в файл с именем Output.txt .
Итак, мы не увидим ничего, напечатанного в консоли, потому что теперь это печатается в самом файле! В этом суть перенаправления вывода. Вы «перенаправляете» вывод в другое место. (На этот раз в Output.txt , а не в консоль)
Как видите, мы распечатали вывод как в консоль, так и в Output.txt .
Сначала мы сохраняем исходный sys.stdout обработчик файла sys.stdout в другую переменную. Нам это нужно не только для восстановления sys.stdout в старом обработчике (указывающем на консоль), но мы также можем печатать на консоль, используя эту переменную!
Обратите внимание, что после записи в файл мы закрываем его, аналогично тому, как мы закрываем файл, потому что этот файл все еще был открыт.
STDIN, STDOUT not streaming correct output when used with pipe in windows
I have two programs:
- Program 1 reads .jpg file in binary mode(_setmode(_fileno(stdin), _O_BINARY) ,_setmode(_fileno(stdout), _O_BINARY) using fread and outputs the using fwrite to stdout.
- Program 2 reads from stdout and outputs to a file( read/write done in binary mode). But I can see that output image is corrupted and not same as input. I executed program1.exe | program2.exe in powershell.
But if I write a program to read a file in binary mode and write it to another file in binary mode, then outputs are same. Problem occurs only when I use stdin and stdout .
The requirement of program is to allow user to input arbitrary input through stdin and write it to a file.
1 Answer 1
Added to address conversation in comments as its relevance may be important to OP. Paying attention to the current encoding settings of your cmd.exe program may be important to do some of the things you are asking for. That topic is discussed in in this very detailed answer. and serve to explain why you are seeing what you are seeing.
Your only stated requirement is «The requirement of program is to allow user to input arbitrary input through stdin and write it to a file.»
An example using fread and fwrite is at bottom, but unless you are required to use these, consider a simpler approach.
Borrowing from the comments, this example is the simplest implementation that does exactly what you described you needed. (And was tested using Windows-10.)
to exit, then read file out.txt .
Reading and outputting a binary file is just about as simple, just change the arguments in fopen() for binary read/write, and point to an image you want to transfer:
No need of course to use , program will exit when file copy is done.
If it is required that you use fread/fwrite , then here is a very minimal example of doing exactly the same task using your code with some modifications: (removed calls to setmode , in buffer sized to file it will contain, removed while loop, see in-code comments.)