Я хотел бы добавить немного больше подробностей к объяснению, предоставленному всеми пользователям python 2. raw_input()
, который, к настоящему времени, вы знаете, что оценивает, какие данные передаются пользователем в виде строки. Это означает, что python не пытается даже понять введенные данные снова. Все, что он будет учитывать, это то, что введенные данные будут строками, независимо от того, является ли она фактической строкой или int или что-то еще.
В то время как input()
пытается понять данные, введенные пользователем. Таким образом, вход, подобный helloworld
, даже покажет ошибку как «helloworld is undefined
».
В заключение, для python 2, чтобы ввести строку тоже, вам нужно ввести ее как 'helloworld
', которая является общей структурой, используемой в python для использования строк.
От ответ Magnus Lycka в списке рассылки :
можно пропустить буферизацию для целого процесса Python с помощью "Python-u" (or#!/usr/bin/env Python-u и т.д.) или путем установки переменной среды PYTHONUNBUFFERED.
Вы могли также заменить sys.stdout некоторым другим потоком как обертка, которая делает сброс после каждого вызова.
class Unbuffered(object): def __init__(self, stream): self.stream = stream def write(self, data): self.stream.write(data) self.stream.flush() def writelines(self, datas): self.stream.writelines(datas) self.stream.flush() def __getattr__(self, attr): return getattr(self.stream, attr) import sys sys.stdout = Unbuffered(sys.stdout) print 'Hello'
Можно создать освободивший буфер файл и присвоить этот файл sys.stdout.
import sys
myFile= open( "a.log", "w", 0 )
sys.stdout= myFile
Вы не можете волшебно изменить предоставленный систему stdout; так как это предоставляется Вашей программе Python ОС.
Да, это включено по умолчанию. Можно отключить его при помощи-u опции на командной строке при вызове Python.
Один путь, который будет освобожден буфер вывод, состоял бы в том, чтобы использовать sys.stderr
вместо sys.stdout
или просто звонить sys.stdout.flush()
, чтобы явно вынудить запись произойти.
Вы могли легко перенаправить все распечатанное путем выполнения:
import sys; sys.stdout = sys.stderr
print "Hello World!"
Или перенаправить только для детали print
оператор:
print >>sys.stderr, "Hello World!"
Для сброса stdout можно просто сделать:
sys.stdout = sys.__stdout__
Да, это.
можно отключить его на командной строке с переключателем "-u".
, С другой стороны, Вы могли назвать .flush () на sys.stdout на каждой записи (или обернуть его с объектом, который делает это автоматически)
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Кредиты: "Sebastian", где-нибудь в списке рассылки Python.
стороннее РЕДАКТИРОВАНИЕ
Неподдерживаемый в последних версиях Python 3
Вы также можете использовать fcntl для изменения флагов файлов на лету.
fl = fcntl.fcntl(fd.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC # or os.O_DSYNC (if you don't care the file timestamp updates)
fcntl.fcntl(fd.fileno(), fcntl.F_SETFL, fl)