පයිතන් මුද්රණයේ ප්රතිදානය ගලා යන්නේ කෙසේද?
මෙය කිරීමට ක්රම පහක් මම යෝජනා කරමි:
- පයිතන් 3 හි, අමතන්න
print(..., flush=True)
(පයිතන් 2 හි මුද්රණ ශ්රිතයේ ෆ්ලෂ් තර්කය නොමැත, මුද්රණ ප්රකාශය සඳහා ප්රතිසමයක් නොමැත).
file.flush()
ප්රතිදාන ගොනුව අමතන්න (මෙය සිදු කිරීම සඳහා අපට පයිතන් 2 හි මුද්රණ කාර්යය ඔතා ගත හැකිය), උදාහරණයක් ලෙසsys.stdout
- මොඩියුලයේ සෑම මුද්රණ ශ්රිත ඇමතුමකටම අර්ධ ශ්රිතයක් සහිත මෙය
print = partial(print, flush=True)
ගෝලීය මොඩියුලයට යොදන්න .
-u
පරිවර්තක විධානයට ලබා දුන් ධජයක් ( ) සමඟ ක්රියාවලියට මෙය යොදන්න
- ඔබගේ පරිසරයේ ඇති සෑම පයිතන් ක්රියාවලියකටම මෙය යොදන්න
PYTHONUNBUFFERED=TRUE
(මෙය අහෝසි කිරීමට විචල්යය සකසන්න).
පයිතන් 3.3+
පයිතන් 3.3 හෝ ඊට වැඩි භාවිතා කිරීමෙන් ඔබට ශ්රිතයට flush=True
මූල පදයක් ලෙස සැපයිය හැකිය print
:
print('foo', flush=True)
පයිතන් 2 (හෝ <3.3)
ඔවුන් flush
තර්කය පයිතන් 2.7 වෙත ආපසු යැව්වේ නැත. එබැවින් ඔබ පයිතන් 2 (හෝ 3.3 ට වඩා අඩු) භාවිතා කරන්නේ නම් සහ 2 සහ 3 යන දෙකටම අනුකූල කේත අවශ්ය නම්, මම පහත දැක්වෙන අනුකූලතා කේතය යෝජනා කරමි. ( __future__
ආනයනය ඔබගේ මොඩියුලයේ ඉහළින්ම තිබිය යුතු බව සලකන්න ):
from __future__ import print_function
import sys
if sys.version_info[:2] < (3, 3):
old_print = print
def print(*args, **kwargs):
flush = kwargs.pop('flush', False)
old_print(*args, **kwargs)
if flush:
file = kwargs.get('file', sys.stdout)
# Why might file=None? IDK, but it works for print(i, file=None)
file.flush() if file is not None else sys.stdout.flush()
ඉහත අනුකූලතා කේතය බොහෝ භාවිතයන් ආවරණය කරනු ඇත, නමුත් වඩාත් ගැඹුරු ප්රතිකාරයක් සඳහා six
මොඩියුලය බලන්න .
විකල්පයක් ලෙස, ඔබට file.flush()
මුද්රණයෙන් පසු ඇමතිය හැකිය , උදාහරණයක් ලෙස, පයිතන් 2 හි මුද්රණ ප්රකාශය සමඟ:
import sys
print 'delayed output'
sys.stdout.flush()
පෙරනිමිය එක් මොඩියුලයකට වෙනස් කිරීම flush=True
මොඩියුලයක ගෝලීය විෂය පථය මත functools.partial භාවිතා කිරීමෙන් මුද්රණ කාර්යයේ පෙරනිමිය ඔබට වෙනස් කළ හැකිය:
import functools
print = functools.partial(print, flush=True)
ඔබ අපගේ නව අර්ධ ක්රියාකාරිත්වය දෙස බැලුවහොත්, අවම වශයෙන් පයිතන් 3 හි:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
එය සාමාන්ය ආකාරයටම ක්රියාත්මක වන බව අපට පෙනේ:
>>> print('foo')
foo
අපට නව පෙරනිමිය අභිබවා යා හැකිය:
>>> print('foo', flush=False)
foo
නැවත වරක් සටහන් කරන්න, මෙය වර්තමාන ගෝලීය විෂය පථය පමණක් වෙනස් කරයි, මන්ද වර්තමාන ගෝලීය විෂය පථයේ මුද්රණ නාමය බිල්ඩින් print
ශ්රිතය යටපත් කරනු ඇත (හෝ පයිතන් 2 හි එකක් භාවිතා කරන්නේ නම්, එම ගෝලීය විෂය පථය තුළ අනුකූලතා ශ්රිතය නොසලකා හැරීම ).
මොඩියුලයේ ගෝලීය විෂය පථය වෙනුවට ශ්රිතයක් තුළ මෙය කිරීමට ඔබට අවශ්ය නම්, ඔබ එයට වෙනත් නමක් දිය යුතුය, උදා:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
ඔබ එය ශ්රිතයක ගෝලීය යැයි ප්රකාශ කරන්නේ නම්, ඔබ එය මොඩියුලයේ ගෝලීය නාම අවකාශය මත වෙනස් කරයි, එබැවින් ඔබ එය ගෝලීය නාම අවකාශයට දැමිය යුතුය, එම නිශ්චිත හැසිරීම හරියටම ඔබට අවශ්ය දේ නොවේ නම්.
ක්රියාවලිය සඳහා පෙරනිමිය වෙනස් කිරීම
මම හිතන්නේ මෙහි ඇති හොඳම විකල්පය වන්නේ -u
ධජය භාවිතා කර නොවරදින ප්රතිදානය ලබා ගැනීමයි.
$ python -u script.py
හෝ
$ python -um package.module
සිට ලේඛන :
Stdin, stdout සහ stderr මුළුමනින්ම නොසැලකිලිමත් වීමට බල කරන්න. එය වැදගත් වන පද්ධති වලදී, stdin, stdout සහ stderr ද්විමය ප්රකාරයට දමන්න.
මෙම විකල්පයට බලපෑම් නොකරන file.readlines () සහ ගොනු වස්තු (sys.stdin හි පේළිය සඳහා) අභ්යන්තර බෆරින් ඇති බව සලකන්න. මේ සඳහා වැඩ කිරීමට, ඔබට 1: loop තුළ file.readline () භාවිතා කිරීමට අවශ්ය වනු ඇත.
ෂෙල් මෙහෙයුම් පරිසරය සඳහා පෙරනිමිය වෙනස් කිරීම
ඔබ පරිසර විචල්යය නොවරදින නූලකට සකසන්නේ නම් පරිසරයේ හෝ පරිසරයේ ඇති සියලුම පයිතන් ක්රියාවලීන් සඳහා ඔබට මෙම හැසිරීම ලබා ගත හැකිය:
උදා: ලිනක්ස් හෝ ඕඑස්එක්ස් වලින්:
$ export PYTHONUNBUFFERED=TRUE
හෝ වින්ඩෝස්:
C:\SET PYTHONUNBUFFERED=TRUE
සිට ලේඛන :
පයිතොනන්බුෆර්ඩ්
මෙය හිස් නොවන නූලකට සකසා ඇත්නම් එය -u විකල්පය නියම කිරීමට සමාන වේ.
අතිරේක
පයිතන් 2.7.12 වෙතින් මුද්රණ කාර්යය සඳහා උපකාර මෙන්න - තර්කයක් නොමැති බව සලකන්න flush
:
>>> from __future__ import print_function
>>> help(print)
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
__future__
අනුවාදයට ඇතුළත් නොවන්නේflush
“ෆ්ලෂ් තර්කය පයිතන් 3.3 හි එකතු කර ඇති හෙයිනි (මුද්රණයෙන් පසු () අනාගත ආනයනයක් හරහා 2.7 වෙත ආපසු යවන ලදි)” bugs.python.org/issue28458