පයිතන්හි stderr වෙත මුද්‍රණය කරන්නේ කෙසේද?


1367

Stderr වෙත ලිවීමට ක්‍රම කිහිපයක් තිබේ:

# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

බව පටහැනි බව පෙනේ Python ක Zen # 13 ඒ දේ මෙහි වෙනස, සහ එක් ආකාරයකින් හෝ තවත් කිසිදු වාසි හෝ අවාසි පවතින බවත්; භාවිතා කළ යුතු මාර්ගය කුමක්ද?

හා වඩාත් සුදුසු එකම එක - - එය කිරීමට පැහැදිලි මඟ එක් තිබිය යුතුයි.


48
ලැයිස්තුගත කර ඇති පළමු ක්‍රමය පයිතන් 3 හි ඉවත් කර ඇති බොහෝ දේවලින් එකකි. සම්මුතිය පෙනෙන්නේ >> සින්ටැක්ස් කෙසේ හෝ කැත බවය, මුද්‍රණය දැන් ශ්‍රිතයක් බැවින් සින්ටැක්ස් කිසි විටෙකත් ක්‍රියා නොකරනු ඇත.
ස්ටීව් හොවාර්ඩ්

25
මම භාවිතා කරන්න: sys.exit ( 'දෝෂය: <දෝෂයක් පෙළ>')
පැහැදිලි

1
මුද්‍රණය භාවිතා කරන්න.
PythonMaster202

Answers:


1192

කෙටි + නම්‍යශීලී + අතේ ගෙන යා හැකි + කියවිය හැකි එකම එක මෙය බව මට පෙනී ගියේය:

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

ශ්‍රිතය eprintසම්මත printශ්‍රිතයට සමාන ආකාරයකින් භාවිතා කළ හැකිය :

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz

29
එක් සිතුවිල්ලක් පමණි: මෙය මුද්‍රණ ශ්‍රිතය ආනයනය කරනු ඇති බැවින්, මුල් පිටපතෙහි ඇති අනෙක් සෑම "මුද්‍රණයක්ම" දැන් "ක්‍රියාකාරී" කිරීම "(" සහ ")" එකතු කිරීම අවශ්‍ය වේ. එබැවින් එය මෙම ක්‍රමයට එරෙහි සුළු වැඩ වර්ජනයකි, IMO.
ඩෑන් එච්

48
@DanH ඔව් මේ හමුදා ඔබ ඔබේ කේතය Python3-සූදානම් කළ යුතු බව ය. මම හිතන්නේ බොහෝ අය එයට කැමති වීමට හේතුව මෙය විය හැකිය!
මාර්ක්

18
Ark මාර්ක් ... ඔව්, එය ඔබේ කේතය පයිතන් 3 සූදානම් කිරීමට බල කරයි ... එය දැන් එය කිරීමට ද බල කරයි, නිදොස් කිරීමේ තොරතුරු ස්ටෙඩර් වෙත මුද්‍රණය කිරීම සඳහා ... එය මට තවත් කරදරයක් වනු ඇත බොහෝ විට මම යමක් නිදොස් කිරීමට උත්සාහ කරන විට. (මම නව සින්ටැක්ස් දෝෂ හඳුන්වා නොදෙන්නෙමි!) :-)
ඩෑන් එච්

32
FWIW මෙම කේතය ඔබේ සමස්ත වැඩසටහනේ ක්‍රියාකාරී අනුවාදය භාවිතා කිරීමට බල නොකරයිprint . හි අර්ථ දැක්වීම අඩංගු මොඩියුලයේ පමණි eprint(). එය තනිවම කුඩා ගොනුවකට දමන්න, එයින් eprintඔබගේ අනෙක් ලිපිගොනු වෙත ආනයනය කරන්න, printඔබට අවශ්‍ය තාක් කල් ප්‍රකාශය භාවිතා කළ හැකිය .
ඇලෙක්සිස්

4
ඔබ මුද්‍රණයේ සිට මුද්‍රණ ශ්‍රිතය දක්වා පරිවර්තනය කිරීම 2to3 දැනටමත් ඔබ වෙනුවෙන් ස්වයංක්‍රීය කර ඇති සරල සොයා ගැනීමකි. ඔබ නොමැති නම් දැනටමත් එය කරන්න; python2 වසර 2 කට අඩු කාලයකින් නැති වී යනු ඇත ... 2 ත් 3 ත් අතර සමහර දේවල් ටිකක් උපක්‍රමශීලී විය හැකිය; මුද්‍රණ කාර්යය ඒවායින් එකක් නොවේ. Docs.python.org/2/library/2to3.html
බොබ්පෝල්

558
import sys
sys.stderr.write()

මගේ තේරීම, වඩා කියවිය හැකි සහ ඔබ කිරීමට අදහස් කරන දේ හරියටම කියමින් අනුවාද හරහා ගෙන යා හැකි ද?

සංස්කරණය කරන්න: 'පයිතොනික්' වීම කියවීමේ හැකියාව සහ ක්‍රියාකාරිත්වය පිළිබඳ තුන්වන අදහසකි ... මේ කාරණා දෙක මනසේ තබාගෙන, පයිතන් සමඟ ඔබේ කේතයෙන් 80% ක් පයිතොනික් වනු ඇත. ලැයිස්තු අවබෝධය බොහෝ විට භාවිතා නොකරන 'විශාල දෙය' (කියවීමේ හැකියාව).


91
නළා ගැනීමට අමතක නොකරන්න.
temoto

10
printප්‍රකාශයේ වාසිය නම්, නූල් නොවන අගයන් පළමුව පරිවර්තනය නොකර පහසුවෙන් මුද්‍රණය කිරීමයි. ඔබට මුද්‍රණ ප්‍රකාශයක් අවශ්‍ය නම්, පයිතන් 3 සූදානම් වීමට 3 වන විකල්පය භාවිතා කිරීමට මම නිර්දේශ කරමි
vdboor

57
sys.stderr.write()ඒ වගේ දෙයක් නැහැ print. එය නව රේඛාවක් එක් නොකරයි.
කර්නල් භීතිකාව

42
@temoto - stderr බෆර් කර නැත, එබැවින් ෆ්ලෂ් කිරීමට අවශ්‍ය නැත.
මතෙ

11
KSkipHuffman ඔබ අදහස් කළේ os.linesep. මේ stderrඅපි කතා කරන්නේ, සියල්ලට පසු. කොන්සෝලය වැරදි නව රේඛාවක් සමඟ පටලවා ගැනීමට අවශ්‍ය නැත.
jpmc26

188

print >> sys.stderrපයිතන් 3 හි ගොස් ඇත. http://docs.python.org/3.0/whatsnew/3.0.html පවසයි:

Old: print >> sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)

අපගෙන් බොහෝ දෙනෙකුට, විධානයේ අවසානය දක්වා ගමනාන්තය බැහැර කිරීම තරමක් අස්වාභාවික බවක් දැනේ. විකල්පය

sys.stderr.write("fatal error\n")

වඩා වස්තූන් නැඹුරු බව පෙනේ, සහ අලංකාරය සාමාන්‍ය සිට නිශ්චිත දක්වා යයි. නමුත් writeඑය 1: 1 ආදේශකයක් නොවන බව සලකන්න print.


6
මම හිතන්නේ එය මනාපයක් ඇති කාරණයක්, නමුත් කැත කුමක්දැයි මට නොපෙනේ print('spam', file=sys.stderr). ඔබ එය නැවත නැවතත් කරන්නේ නම්, ඔබට වඩාත් ජනප්‍රිය පිළිතුර මෙන් 'ඊප්‍රින්ට්' ශ්‍රිතය කේත කළ හැකිය, නමුත් එවැනි අවස්ථාවකදී මම අසමි, ලොග් වීමේ වරද කුමක්ද? stackoverflow.com/a/41304513/1450294
මයිකල් ෂෙපර්

1
අභිප්‍රාය පැහැදිලි කිරීමේ තවත් ක්‍රමයක් වනුයේ with sys.stderr as dest:print("ERROR", file=dest)
ඉන්ඩෙන්ට්

138

කිසිවෙකු loggingතවම සඳහන් කර නැත, නමුත් දෝෂ පණිවිඩ සන්නිවේදනය කිරීම සඳහා විශේෂයෙන් ලොග් වීම නිර්මාණය කරන ලදි. මූලික වින්‍යාසය මඟින් stderr වෙත ප්‍රවාහ හසුරුවන ලිවීමක් සැකසෙනු ඇත.

මෙම පිටපත:

# foo.py
import logging

logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
log.warning('I print to stderr by default')
print('hello world')

විධාන රේඛාවේ ධාවනය වන විට පහත ප්‍රති result ලය ඇත:

$ python3 foo.py > bar.txt
I print to stderr by default

සහ bar.txt හි stdout හි මුද්‍රණය කර ඇති 'හෙලෝ වර්ල්ඩ්' අඩංගු වේ.


3
මගේ අත්දැකීම් අනුව, ලොග් වීමට වඩා වැඩි පිරිසක් පණිවිඩ ලොග් කිරීමට මුද්‍රණය භාවිතා කරති. මම හිතන්නේ python4 භාෂාවෙන් මුද්‍රණය ඉවත් කර ඒ සඳහා ලොග් වීම භාවිතා කිරීමට බල කළ යුතුය.
Mnebuerquo

1
මෙය හොඳම පිළිතුරයි !! ... මම මුද්‍රණය හෝ සයිස් සමඟ පොරබදමින් සිටියෙමි හෝ කවුද දන්නේ ... නිසි
ල ging ු

129

සඳහා python, 2 මගේ තේරීම වේ: print >> sys.stderr, 'spam' ඔබ හුදෙක් ලැයිස්තු / dicts ආදිය ආගමට හරවා තොරව එය string කිරීමට මුද්රණය කළ හැක නිසා. print >> sys.stderr, {'spam': 'spam'} වෙනුවට: sys.stderr.write(str({'spam': 'spam'}))


6
ශබ්ද කෝෂයක් මුද්‍රණය කිරීමට වඩා පයිතොනික් ක්‍රමය "{0}".format({'spam': 'spam'})කෙසේ හෝ වේවා , එසේ නොවේ ද? මම පැහැදිලිවම ඔබ නූල් බවට පරිවර්තනය කිරීමෙන් වැළකී සිටිය යුතුයි. සංස්කරණය කරන්න: මම අහම්බෙන් ව්‍යාකරණයක්
luketparkinson

2
@luketparkinson මේ සියල්ල නිදොස්කරණය කිරීම ගැන - එබැවින්, හැකි තරම් සරලම කේතය භාවිතා කිරීම වඩාත් සුදුසු යැයි මම සිතමි.
ෆ්‍රැන්කොව්ස්කි බොග්ඩාන්

88
මෙය පයිතන් 3 හි ක්‍රියා නොකරයි, එබැවින් ඔබ එය නව කේතයකින් වළක්වා ගත යුතුය.
ජොනී ජේඩී

33

මම පහත සඳහන් දේ කළේ පයිතන් 3 භාවිතා කරමිනි:

from sys import stderr

def print_err(*args, **kwargs):
    print(*args, file=stderr, **kwargs)

එබැවින් දැන් මට යතුරුපද තර්ක එකතු කිරීමට හැකි වී ඇත, උදාහරණයක් ලෙස, කරත්ත නැවත පැමිණීම වළක්වා ගැනීමට:

print_err("Error: end of the file reached. The word ", end='')
print_err(word, "was not found")

2
මම ඔබට යෝජනා කිරීමට අදහස් කළේ ඔබට අර්ධයක් ද භාවිතා කළ හැකි නමුත් අර්ධ වශයෙන් නිර්මානය කරන අවස්ථාවේ දී ශ්‍රිතයට අර්ධ වශයෙන් stderr පවරන බවයි. අර්ධ වශයෙන් තවමත් මුල් stderr වස්තුව රඳවා තබා ඇති බැවින් මෙය පසුව stderr නැවත හරවා යැවීම වළක්වයි.
Rebs

31

ඔබේ පළමු ප්‍රවේශය:

print >> sys.stderr, 'spam' 

යනු “එකකි. එය කළ හැකි පැහැදිලි ක්‍රමය” අනෙක් අය රීතිය # 1 තෘප්තිමත් නොකරයි (“කැතට වඩා ලස්සනයි.”)


109
මතයන් වෙනස් වේ. මෙය මට අවම වශයෙන් පැහැදිලිය .
porgarmingduod

4
Li ඇලිවේලි වරහන් නොමැත, මෙය පැරණි පයිතන් <= 2 සින්ටැක්ස් වේ, එබැවින් පයිතන් 3 අනුකූල නොවේ.
Rebs


4
එය >>කෘතිමව අදහස් කරන්නේ කුමක්ද? >එය බාෂ් පිටපත් කිරීමේ උත්සාහයක් බව මට වැටහී ඇත , එබැවින් එය සිදු කිරීම සඳහා සපත්තු සහිත සින්ටැක්ස් කිහිපයක් තිබේද?
Dmytro Sirenko

2
ArEarlGray එය C ++ හි ප්‍රවාහ ඇතුළත් කිරීමේ ක්‍රියාකරුගේ රඳවා ගැනීමකි:std::cout << "spam";
ෂෝන් ඇල්රෙඩ්

19

මෙය සම්මත මුද්‍රණ ශ්‍රිතය අනුකරණය කරන නමුත් stderr මත ප්‍රතිදානය කරයි

def print_err(*args):
    sys.stderr.write(' '.join(map(str,args)) + '\n')

8
මම sys.stderr.flush ()
AMS

5
@AMS - ඇයි? printෆ්ලෂ් ඇතුළත් නොවේ.
රොබෝ

4
ඔබට එය සැබවින්ම කළ හැකි විට අනුකරණය කරන්නේ ඇයි?
පිස්සු භෞතික විද්‍යා

19

පයිතන් 3 හි කෙනෙකුට මුද්‍රණය () භාවිතා කළ හැකිය :

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

කොටුවෙන් පිටත:

import sys
print("Hello, world!", file=sys.stderr)

හෝ:

from sys import stderr
print("Hello, world!", file=stderr)

මෙය සරල වන අතර ඒ හැර වෙනත් කිසිවක් ඇතුළත් කිරීම අවශ්‍ය නොවේ sys.stderr.


16

සංස්කරණය කරන්න sys.stderr වෙනස් කිරීම හා හැසිරීම යාවත්කාලීන නොවීම සමඟ ඇති විය හැකි ව්‍යාකූලත්වය මෙම පිළිතුර අනෙක් අය පෙන්වා දී ඇති පරිදි සරල ශ්‍රිතයක් භාවිතා කිරීම තරම් හොඳ නොවන බව මම සිතමි.

අර්ධ වශයෙන් පමණක් භාවිතා කිරීමෙන් ඔබට කේත පේළි 1 ක් ඉතිරි වේ. විභව ව්යාකූලත්වය කේත පේළි 1 ක් ඉතිරි කිරීම වටී නැත.

මුල්

එය වඩාත් පහසු කිරීම සඳහා, මෙහි 'අර්ධ' භාවිතා කරන අනුවාදයක් ඇත, එය කාර්යයන් එතීමට විශාල උපකාරයකි.

from __future__ import print_function
import sys
from functools import partial

error = partial(print, file=sys.stderr)

ඔබ එය එසේ භාවිතා කරයි

error('An error occured!')

පහත සඳහන් දෑ සිදු කිරීමෙන් එය stderr වෙත මුද්‍රණය වනවාද යන්න පරීක්ෂා කළ හැකිය ( http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):

# over-ride stderr to prove that this function works.
class NullDevice():
    def write(self, s):
        pass
sys.stderr = NullDevice()

# we must import print error AFTER we've removed the null device because
# it has been assigned and will not be re-evaluated.
# assume error function is in print_error.py
from print_error import error

# no message should be printed
error("You won't see this error!")

මේ එහි අවාසිය අර්ධ වේ පැවරුම් නිර්මාණය කරන අවස්ථාවේ දී ඔතා කටයුතු කිරීමට sys.stderr වටිනාකම. එයින් අදහස් වන්නේ, ඔබ පසුව stderr නැවත හරවා යැවුවහොත් එය මෙම ශ්‍රිතයට බලපාන්නේ නැත. ඔබ stderr යළි හරවා යැවීමට අදහස් කරන්නේ නම්, මෙම පිටුවේ aaguirre විසින් සඳහන් කර ඇති ** kwargs ක්‍රමය භාවිතා කරන්න.


කෝරි ගෝල්ඩ්බර්ග්ගේ කේතය හොඳම ලෙස ක්‍රියාත්මක වන්නේ රූබ් ගෝල්ඩ්බර්ග් යන්ත්‍රයකද? : P
Agi Hammerthief

2
BTW: "ව්‍යංජන" යනු ඔබට "අර්ධ" ගැන වැඩි විස්තර දැන ගැනීමට අවශ්‍ය නම් (වැඩි) ප්‍රයෝජනවත් සෙවුම් පදයකි.
මාර්ක්

5

Stdout සඳහා ද මෙය අදාළ වේ:

print 'spam'
sys.stdout.write('spam\n')

අනෙක් පිළිතුරු වල සඳහන් පරිදි, මුද්‍රණය බොහෝ විට වඩාත් පහසු (උදා: නිදොස් කිරීමේ තොරතුරු මුද්‍රණය කිරීම සඳහා) ලස්සන අතුරු මුහුණතක් ඉදිරිපත් කරයි, ලිවීම වේගවත් වන අතර ප්‍රතිදානය නිශ්චිත ආකාරයකින් සංයුති කිරීමට සිදු වන විට වඩාත් පහසු වේ. නඩත්තු කිරීමේ හැකියාව ද මම සලකා බලමි:

  1. ඔබට පසුව stdout / stderr සහ සාමාන්‍ය ගොනුවක් අතර මාරු වීමට තීරණය කළ හැකිය.

  2. පයිතන් 3 හි මුද්‍රණය () වාක්‍ය ඛණ්ඩය වෙනස් වී ඇත, එබැවින් ඔබට අනුවාද දෙකටම සහය දැක්වීමට අවශ්‍ය නම් () ලිවීම වඩා හොඳ විය හැකිය.


4
from __future__ import print_functionපයිතන් 2.6+ සහ පයිතන් 3 යන දෙකටම සහය දැක්වීමට වඩා හොඳ ක්‍රමයක් භාවිතා කිරීම
ෆීනික්ස්

4

මම වැඩ කරන්නේ පයිතන් 3.4.3. මම මෙහි යතුරු ලියනය කරන ආකාරය පෙන්වන කුඩා ටයිප් කිරීමක් කපා දමමි:

[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ python3
>>> import sys
>>> print("testing", file=sys.stderr)
testing
>>>
[18:19 jsilverman@JSILVERMAN-LT7 pexpect]$ 

එය වැඩ කලාද? Stderr ගොනුවකට හරවා යැවීමට උත්සාහ කර සිදුවන්නේ කුමක්දැයි බලන්න:

[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ python3 2> /tmp/test.txt
>>> import sys
>>> print("testing", file=sys.stderr)
>>> [18:22 jsilverman@JSILVERMAN-LT7 pexpect]$
[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$ cat /tmp/test.txt
Python 3.4.3 (default, May  5 2015, 17:58:45)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
testing

[18:22 jsilverman@JSILVERMAN-LT7 pexpect]$

හොඳයි, පයිතන් ඔබට ලබා දෙන කුඩා හැඳින්වීම පසෙකට දමා ඇත (එය වෙනත් තැනකට යන්නේ කෙසේද?), එය ක්‍රියාත්මක වේ.


2

ඔබ සරල පරීක්ෂණයක් කරන්නේ නම්:

import time
import sys

def run1(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        print >> sys.stderr, 'X'
    elapsed = (time.time()-cur)
    return elapsed

def run2(runs):
    x = 0
    cur = time.time()
    while x < runs:
        x += 1
        sys.stderr.write('X\n')
        sys.stderr.flush()
    elapsed = (time.time()-cur)
    return elapsed

def compare(runs):
    sum1, sum2 = 0, 0
    x = 0
    while x < runs:
        x += 1
        sum1 += run1(runs)
        sum2 += run2(runs)
    return sum1, sum2

if __name__ == '__main__':
    s1, s2 = compare(1000)
    print "Using (print >> sys.stderr, 'X'): %s" %(s1)
    print "Using (sys.stderr.write('X'),sys.stderr.flush()):%s" %(s2)
    print "Ratio: %f" %(float(s1) / float(s2))

Sys.stderr.write () නිරතුරුවම 1.81 ගුණයකින් වේගවත් බව ඔබට පෙනී යනු ඇත!


මම මෙය ධාවනය කරන්නේ නම් ඊට වඩා කුඩා වෙනසක් මට පෙනේ. බොහෝ පිළිතුරු මුද්‍රණ ශ්‍රිතය (පයිතන් 3) නොසලකා හැරීම සිත්ගන්නා කරුණකි. මම මීට පෙර කවදාවත් එය භාවිතා කර නැත (අවස්ථිති), නමුත් මම සිතුවේ මෙම කාල ස්ක්‍රිප්ට් ධාවනය කර මුද්‍රණ කාර්යය එක් කිරීමටයි. මුද්‍රණ ප්‍රකාශය හා ක්‍රියාකාරිත්වය සෘජුවම සැසඳිය නොහැක ( අනාගතයේ සිට ආනයනය මුළු ගොනුවටම අදාළ වන අතර මුද්‍රණ ප්‍රකාශය වෙස්මුහුණු කරයි) නමුත් ප්‍රකාශය වෙනුවට මුද්‍රණ ශ්‍රිතය භාවිතා කිරීම සඳහා මෙම කේතය නැවත ලිවීමෙන් මට විශාල වේගයක් පෙනේ (~ 1.6 තරමක් විචල්‍ය වුවද ) මුද්‍රණ කාර්යයට පක්ෂව.
හාමිෂ්

1
මෙම පරීක්ෂණයේ ප්‍රති result ලය කෙසේ හෝ නොමඟ යවන සුළුය. 'X' වෙනුවට 'XXXXXXXXXXXXXXXXXX' මුද්‍රණය කරන්න, අනුපාතය 1.05 දක්වා පහත වැටේ . බොහෝ පයිතන් වැඩසටහන් තනි අක්ෂරයකට වඩා මුද්‍රණය කළ යුතු යැයි මම සිතමි.
සෑම විටම

15
අනතුරු ඇඟවීම් මුද්‍රණය කිරීම වැනි දෙයක් සඳහා මම කාර්ය සාධනය ගැන තැකීමක් නොකරමි.
wim

මම දන්නවා එය ටික කලක් ගතවී ඇති බව, නමුත් ඔබ මගේ තනතුරෙන් බොහෝ කලකට පසුව සමානව පිළිතුරු දුන්නා ... මම යෝජනා කරනවාට වඩා ඔබ කාර්ය සාධනය ගැන සැලකිලිමත් නොවන්නේ නම් වඩා පයිතොනික් ක්‍රමය වනුයේ sys.stderr.write භාවිතා කිරීම මිස WTF නොවේද?!? ">>" අක්ෂර. මෙම sys.stdout නාම අවකාශය දිගු නම් ඔබට එය නැවත නම් කළ හැකිය ... (එනම්, sys ආනයන stderr වෙතින් stderr_fh ලෙස). එවිට ඔබට stderr_fh.write ("blah") කළ හැකිය
ThePracticalOne

1
[3/3] මෙම මිණුම් දණ්ඩ වඩාත් නිවැරදි වුවද, ඒ ගැන කරදර වීම වටී නැත. නුත් ලියා ඇති පරිදි: “ක්‍රමලේඛකයින් ඔවුන්ගේ වැඩසටහන් වල අවිධිමත් කොටස්වල වේගය ගැන සිතීමට හෝ කනස්සල්ලට පත්වීමට විශාල කාලයක් නාස්ති කරයි. කාර්යක්ෂමතාව සඳහා වන මෙම උත්සාහයන් නිදොස් කිරීම සහ නඩත්තු කිරීම සලකා බැලීමේදී ප්‍රබල negative ණාත්මක බලපෑමක් ඇති කරයි. කුඩා දේ ගැන අප අමතක කළ යුතුය කාර්යක්ෂමතාව, වේලාවෙන් 97% ක් පමණ කියන්න: නොමේරූ ප්‍රශස්තකරණය සියලු නපුරේ මුල වේ. ”
කොරී ගෝල්ඩ්බර්ග්

1

මාරාන්තික දෝෂයක් හේතුවෙන් ඔබට වැඩසටහනකින් ඉවත් වීමට අවශ්‍ය නම්, මෙය භාවිතා කරන්න:

sys.exit("Your program caused a fatal error. ... description ...")

සහ import sysශීර්ෂය තුළ.


-2

ප්‍රශ්නයට පිළිතුර: පයිතන්හි stderr මුද්‍රණය කිරීමට වෙනස් ක්‍රම ඇති නමුත් එය 1 මත රඳා පවතී.) අපි භාවිතා කරන්නේ කුමන පයිතන් අනුවාදයද?) අපට අවශ්‍ය නිශ්චිත ප්‍රතිදානය.

මුද්‍රණ සහ ස්ටෙඩර්ගේ ලිවීමේ කාර්යය අතර ඇති වෙනස: stderr : stderr (සම්මත දෝෂය) යනු සෑම යුනික්ස් / ලිනක්ස් පද්ධතියකටම ගොඩනගා ඇති නලයකි, ඔබේ වැඩසටහන බිඳ වැටී නිදොස් කිරීමේ තොරතුරු මුද්‍රණය කරන විට (පයිතන්හි ලුහුබැඳීමක් වැනි), එය ස්ටෙඩර් වෙත යයි පයිප්ප.

මුද්‍රණය කරන්න : print යනු ආදාන ආකෘතිකරණය කරන එතීමකි (ආදානය යනු තර්කය සහ නව රේඛාව අවසානයේ ඇති අවකාශයයි) එවිට එය දී ඇති වස්තුවක ලිවීමේ කාර්යය ලෙස හැඳින්වේ, ලබා දී ඇති වස්තුව පෙරනිමියෙන් sys.stdout වේ, නමුත් අපට හැකිය ගොනුවක් සම්මත කරන්න, එනම් අපට ආදානය ගොනුවක මුද්‍රණය කළ හැකිය.

පයිතන් 2: අපි පයිතන් 2 භාවිතා කරන්නේ නම්

>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi

පයිතන් 2 පසුපස කොමාව පරාමිතියක් බවට පත්ව ඇත, එබැවින් මුද්‍රණයෙන් පසු නව රේඛාව මඟ හැරීම සඳහා අපි පසුපස කොමාව භාවිතා කරන්නේ නම්, මෙය පයිතන් 3 හි මුද්‍රණය මෙන් පෙනේ ('මුද්‍රණය කිරීමට පෙළ', අවසානය = '') එය පයිතන් 2 යටතේ ඇති සින්ටැක්ස් දෝෂයකි. .

http://python3porting.com/noconv.html

අපි python3 හි ඉහත sceario එක පරීක්ෂා කළහොත්:

>>> import sys
>>> print("hi")
hi

පයිතන් 2.6 යටතේ මුද්‍රණය ශ්‍රිතයක් බවට පත් කිරීම සඳහා අනාගත ආනයනයක් ඇත. එබැවින් සින්ටැක්ස් දෝෂ සහ වෙනත් වෙනස්කම් වලක්වා ගැනීම සඳහා අපි අනාගත ආනයන print_function වෙතින් මුද්‍රණ () භාවිතා කරන ඕනෑම ගොනුවක් ආරම්භ කළ යුතුය . මෙම අනාගත ආනයන පමණක් Python 2.6 යටතේ ක්රියා කරන අතර පසුව, ඒ නිසා Python 2.5 හා ඉන් පෙර ඔබට විකල්ප දෙකක් ඇත. ඔබට වඩාත් සංකීර්ණ මුද්‍රණය සරල දෙයකට පරිවර්තනය කළ හැකිය, නැතහොත් ඔබට පයිතන් 2 සහ පයිතන් 3 යටතේ ක්‍රියාත්මක වන වෙනම මුද්‍රණ ශ්‍රිතයක් භාවිතා කළ හැකිය.

>>> from __future__ import print_function
>>> 
>>> def printex(*args, **kwargs):
...     print(*args, file=sys.stderr, **kwargs)
... 
>>> printex("hii")
hii
>>>

නඩුව: සැලකිල්ලට ගත යුතු කරුණ නම් sys.stderr.write () හෝ sys.stdout.write () (stdout (සම්මත ප්‍රතිදානය) යනු සෑම යුනික්ස් / ලිනක්ස් පද්ධතියක් තුළම ගොඩනගා ඇති නලයකි) මුද්‍රණය සඳහා ආදේශකයක් නොවන නමුත් ඔව් අපට එය යම් අවස්ථාවක විකල්පයක් ලෙස භාවිතා කළ හැකිය. මුද්‍රණය යනු ආදාන අවකාශය හා නව රේඛාව සමඟ ඔතා අවසානයේ ලිවීමේ කාර්යය භාවිතා කරයි. Sys.stderr.write () වේගවත් වීමට හේතුව මෙයයි.

සටහන: අපට ලොග් වීම භාවිතා කර නිදොස්කරණය කළ හැකිය

#test.py
import logging
logging.info('This is the existing protocol.')
FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning("Protocol problem: %s", "connection reset", extra=d)

https://docs.python.org/2/library/logging.html#logger-objects

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.