নেই contextlib.redirect_stdout()
ফাংশন পাইথন 3.4 মধ্যে:
from contextlib import redirect_stdout
with open('help.txt', 'w') as f:
with redirect_stdout(f):
print('it now prints to `help.text`')
এটি অনুরূপ:
import sys
from contextlib import contextmanager
@contextmanager
def redirect_stdout(new_target):
old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout
try:
yield new_target # run some code with the replaced stdout
finally:
sys.stdout = old_target # restore to the previous value
এটি পূর্ববর্তী পাইথন সংস্করণে ব্যবহার করা যেতে পারে। পরবর্তী সংস্করণটি পুনরায় ব্যবহারযোগ্য নয় । চাইলে এটি তৈরি করা যায়।
এটি ফাইল বর্ণনাকারী স্তরে যেমন স্টডআউটকে পুনঃনির্দেশ করে না:
import os
from contextlib import redirect_stdout
stdout_fd = sys.stdout.fileno()
with open('output.txt', 'w') as f, redirect_stdout(f):
print('redirected to a file')
os.write(stdout_fd, b'not redirected')
os.system('echo this also is not redirected')
b'not redirected'
এবং ফাইলে 'echo this also is not redirected'
পুনঃনির্দেশিত হয় না output.txt
।
ফাইল বর্ণনাকারী স্তরে পুনর্নির্দেশ os.dup2()
করতে, ব্যবহার করা যেতে পারে:
import os
import sys
from contextlib import contextmanager
def fileno(file_or_fd):
fd = getattr(file_or_fd, 'fileno', lambda: file_or_fd)()
if not isinstance(fd, int):
raise ValueError("Expected a file (`.fileno()`) or a file descriptor")
return fd
@contextmanager
def stdout_redirected(to=os.devnull, stdout=None):
if stdout is None:
stdout = sys.stdout
stdout_fd = fileno(stdout)
# copy stdout_fd before it is overwritten
#NOTE: `copied` is inheritable on Windows when duplicating a standard stream
with os.fdopen(os.dup(stdout_fd), 'wb') as copied:
stdout.flush() # flush library buffers that dup2 knows nothing about
try:
os.dup2(fileno(to), stdout_fd) # $ exec >&to
except ValueError: # filename
with open(to, 'wb') as to_file:
os.dup2(to_file.fileno(), stdout_fd) # $ exec > to
try:
yield stdout # allow code to be run with the redirected stdout
finally:
# restore stdout to its previous value
#NOTE: dup2 makes stdout_fd inheritable unconditionally
stdout.flush()
os.dup2(copied.fileno(), stdout_fd) # $ exec >&copied
stdout_redirected()
পরিবর্তে যদি ব্যবহৃত হয় তবে একই উদাহরণটি এখন কাজ করে redirect_stdout()
:
import os
import sys
stdout_fd = sys.stdout.fileno()
with open('output.txt', 'w') as f, stdout_redirected(f):
print('redirected to a file')
os.write(stdout_fd, b'it is redirected now\n')
os.system('echo this is also redirected')
print('this is goes back to stdout')
স্ট্যান্ডআউটে পূর্বে যে আউটপুটটি মুদ্রিত হয়েছিল এখন প্রসঙ্গ ব্যবস্থাপক সক্রিয় output.txt
ততক্ষণ চলে stdout_redirected()
।
দ্রষ্টব্য: stdout.flush()
পাইথন 3 এ সি স্টডিও বাফারগুলি ফ্লাশ করে না যেখানে I / O সরাসরি read()
/ write()
সিস্টেমে কল প্রয়োগ করা হয় । সমস্ত ওপেন সি স্টডিও আউটপুট স্ট্রীমগুলি ফ্লাশ করতে, আপনি libc.fflush(None)
যদি কিছু সি এক্সটেনশান স্টিডিও ভিত্তিক আই / ও ব্যবহার করেন তবে আপনি স্পষ্টভাবে কল করতে পারেন:
try:
import ctypes
from ctypes.util import find_library
except ImportError:
libc = None
else:
try:
libc = ctypes.cdll.msvcrt # Windows
except OSError:
libc = ctypes.cdll.LoadLibrary(find_library('c'))
def flush(stream):
try:
libc.fflush(None)
stream.flush()
except (AttributeError, ValueError, IOError):
pass # unsupported
আপনি stdout
প্যারামিটারটি অন্য স্ট্রিমগুলিকে পুনঃনির্দেশ করতে ব্যবহার করতে পারেন , কেবল sys.stdout
উদাহরণস্বরূপ, মার্জ করতে sys.stderr
এবং sys.stdout
:
def merged_stderr_stdout(): # $ exec 2>&1
return stdout_redirected(to=sys.stdout, stdout=sys.stderr)
উদাহরণ:
from __future__ import print_function
import sys
with merged_stderr_stdout():
print('this is printed on stdout')
print('this is also printed on stdout', file=sys.stderr)
দ্রষ্টব্য: stdout_redirected()
মিশ্রিত বাফার I / O ( sys.stdout
সাধারণত) এবং আনফফারড আই / ও (সরাসরি ফাইল বর্ণনাকারীর ক্রিয়াকলাপ)। সাবধান, বাফারিংয়ের সমস্যা হতে পারে ।
উত্তরের জন্য, আপনার সম্পাদনা: আপনি python-daemon
আপনার স্ক্রিপ্টটি ডিমনাইজ করতে এবং logging
মডিউলটি (যেমন @ এরিকবি 85 প্রস্তাবিত ) ব্যবহার করতে পারবেন print
এবং আপনার দীর্ঘকাল ধরে চলমান পাইথন স্ক্রিপ্টের জন্য কেবল স্ট্রাউডকে পুনর্নির্দেশের জন্য ব্যবহার করতে পারেন যা আপনি nohup
এখন ব্যবহার করছেন।
script.p > file