python

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৯ম খণ্ড)


উদাহরণস্বরূপ, স্ক্রিপ্ট হিসাবে চালানো হলে, moreplus.py কেবল স্ট্রিম sys.stdin পড়ে। কমান্ড-লাইন শেল (যেমন, উইন্ডোজগুলিতে ডস, লিনাক্সে সিএসএ) স্ক্রিপ্টটি শুরু হওয়ার আগে কমান্ড লাইন দ্বারা সূচিত উৎসগুলিতে এমন স্ট্রিমগুলিকে সংযুক্ত করে।স্ক্রিপ্টগুলি তাদের প্রকৃত প্রকৃতি নির্বিশেষে, যারা উত্সগুলি অ্যাক্সেস করতে preopened stdin এবং stdout ফাইল বস্তুগুলি ব্যবহার করে।এবং পাঠকদের গণনা করার জন্য, আমরা এই একাধিক প্যাজার স্ক্রিপ্টটি চারটি ভিন্ন উপায়ে চালাচ্ছি: একটি ফাইলের নাম কমান্ড লাইন পাস করে, ফাইলটিতে স্টেডিন পুনঃনির্দেশ করে এবং কমান্ডের আউটপুট স্টেডিনে পাইপ করে, তার ফাংশন আমদানি করে এবং কল করে। আমদানিযোগ্য ফাংশন, কমান্ড-লাইন আর্গুমেন্ট এবং স্ট্যান্ডার্ড স্ট্রিমগুলি সমর্থন করে, পাইথন সিস্টেম সরঞ্জাম কোডগুলি বিভিন্ন মোডগুলিতে পুনরায় ব্যবহার করা যেতে পারে।
-------------------------------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৮ম খণ্ড)




অবশেষে, এই স্ক্রিপ্টের ইনপুটটিতে এক পাইথন স্ক্রিপ্টের আউটপুট পাইপ করা হয়েছে, ব্যবহারকারীর মিথস্ক্রিয়া ব্যতীত (এবং ভাগ্যবান হওয়ার কারণে নয়) প্রত্যাশিত হিসাবে কাজ করে।
......\System\Streams> python teststreams.py < input.txt | python moreplus.py
Hello stream world      
Enter a number>8 squared is 64
Enter a number>6 squared is 36
Enter a number>Bye
এখানে, এক পাইথন স্ক্রিপ্টের স্ট্যান্ডার্ড আউটপুট একই ডিরেক্টরিতে অবস্থিত অন্য পাইথন স্ক্রিপ্টের স্ট্যান্ডার্ড ইনপুটটিতে সরবরাহ করা হয়: moreplus.py teststreams.py এর আউটপুটটি পড়ে।যেমন কমান্ড লাইনগুলির পুনঃনির্দেশগুলি কেবলমাত্র কাজ করে কারণ স্ক্রিপ্টগুলি কোনও স্ট্যান্ডার্ড ইনপুট এবং আউটপুট আসলেই ইন্টারেক্টিভ ব্যবহারকারী, ফাইল, বা প্রোগ্রামগুলির মধ্যে পাইপগুলি যত্ন করে না।

--------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৭ম খণ্ড)




কিন্তু এখন স্ক্রিপ্টটি সঠিকভাবে একটি ফাইল বা কমান্ড পাইপ থেকে স্টেডিনে পুনঃনির্দেশিত পৃষ্ঠাগুলি পাঠায়, এমনকি যদি একটি পাঠ্য একক প্রদর্শন অংশে ফিট হওয়ার জন্য খুব দীর্ঘ হয়। সর্বাধিক শেলগুলিতে, আমরা যেমন পুনঃনির্দেশ বা পাইপ অপারেটরদের মাধ্যমে এই ধরনের ইনপুট প্রেরণ করি:
C:\...\PP4E\System\Streams> python moreplus.py < moreplus.py
"""
split and interactively page a string, file, or stream of
text to stdout; when run as a script, page stdin or file
whose name is passed on cmdline; if input is stdin, can't
use it for user reply--use platform-specific tools or GUI;
"""
import sys
def getreply():
?n
C:\...\PP4E\System\Streams> type moreplus.py | python moreplus.py
"""
split and interactively page a string, file, or stream of
text to stdout; when run as a script, page stdin or file
whose name is passed on cmdline; if input is stdin, can't
use it for user reply--use platform-specific tools or GUI;
"""         
import sys
def getreply():
?n
----------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৬ষ্ঠ খণ্ড)



এছাড়াও আগে, যখন একটি কমান্ড-লাইন আর্গুমেন্ট দিয়ে চালানো হয়, এই স্ক্রিপ্টটি নামযুক্ত ফাইলের পাঠ্য অনুসারে ইন্টারঅ্যাক্টিভ পৃষ্ঠাগুলি:
C:\...\PP4E\System\Streams> python moreplus.py adderSmall.py
import sys
print(sum(int(line) for line in sys.stdin))
C:\...\PP4E\System\Streams> python moreplus.py moreplus.py
"""
split and interactively page a string, file, or stream of
text to stdout; when run as a script, page stdin or file
whose name is passed on cmdline; if input is stdin, can't
use it for user reply--use platform-specific tools or GUI;
import sys
def getreply():
?n
-------------------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৫ম খণ্ড)



এই সংস্করণের নতুন কোডটি তার getreply ফাংশনে দেখায়। ফাইলের ই্যাস্যাটি পদ্ধতি আমাদের বলে যে স্টেডিন কনসোলের সাথে সংযুক্ত আছে কিনা; যদি এটি হয়, আমরা কেবল আগে স্টেডিনে উত্তরগুলি পড়েছি। অবশ্যই, স্ক্রোলগুলিতে শুধুমাত্র অতিরিক্ত লজিক যুক্ত করতে হবে যা কনসোল ব্যবহারকারীদের সাথে যোগাযোগ করতে এবং স্টেডিনে ইনপুট নিতে পারে। একটি GUI অ্যাপ্লিকেশনে, উদাহরণস্বরূপ, আমরা পরিবর্তে ডায়ালগগুলি পপ আপ করতে, কলব্যাকগুলি চালানোর জন্য কীবোর্ড-প্রেস ইভেন্টগুলি বাঁধতে পারি এবং তাই (আমরা অধ্যায় 7 এ GUI পূরণ করব)।
পুনঃব্যবহারযোগ্য grereply ফাংশন সহ সশস্ত্র, যদিও, আমরা নিরাপদে বিভিন্ন উপায়ে আমাদের আরো প্লাস ইউটিলিটি চালাতে পারেন। আগের মত, আমরা এই মডিউলটির ফাংশনটি সরাসরি আমদানি এবং কল করতে পারি, যা আমরা পৃষ্ঠাতে যেকোন স্ট্রিং পাস করতে পারি:
>>> from moreplus import more
>>> more(open('adderSmall.py').read())
import sys                                     
print(sum(int(line) for line in sys.stdin))

------------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (৪র্থ খণ্ড)



Example 3-8. PP4E\System\Streams\moreplus.py
"""
split and interactively page a string, file, or stream of
text to stdout; when run as a script, page stdin or file
whose name is passed on cmdline; if input is stdin, can't
use it for user reply--use platform-specific tools or GUI;
"""       
import sys
def getreply():
"""
read a reply key from an interactive user
even if stdin redirected to a file or pipe
"""
if sys.stdin.isatty(): # if stdin is console
return input('?') # read reply line from stdin
else:
if sys.platform[:3] == 'win': # if stdin was redirected
import msvcrt # can't use to ask a user
msvcrt.putch(b'?')
key = msvcrt.getche() # use windows console tools
msvcrt.putch(b'\n') # getch() does not echo key
return key
else:
assert False, 'platform not supported'
#linux?: open('/dev/tty').readline()[:-1]
def more(text, numlines=10):
"""
page multiline string to stdout
"""
lines = text.splitlines()
while lines:
chunk = lines[:numlines]
lines = lines[numlines:]
for line in chunk: print(line)
if lines and getreply() not in [b'y', b'Y']: break
if __name__ == '__main__': # when run, not when imported
if len(sys.argv) == 1: # if no command-line arguments
more(sys.stdin.read()) # page stdin, no inputs
else:
more(open(sys.argv[1]).read()) # else page filename argument

--------------------------------------------------------------------

এ্যাডার এবং সর্টের জন্য বিকল্প কোডিং(৩য় খন্ড)




লাইন দ্বারা লাইনটি পড়ার জন্য সোর্টার পরিবর্তন করলেও এটি একটি বড় পারফরম্যান্স বুস্ট হতে পারে না, যদিও তালিকা অনুসারে সাজানোর পদ্ধতিটি ইতিমধ্যেই সম্পূর্ণ হওয়া প্রয়োজন। আমরা 18 অধ্যায়ে দেখতে পাব, ম্যানুয়ালি কোডেড সাজানো অ্যালগরিদম সাধারণত পাইথন তালিকা সাজানোর পদ্ধতির চেয়ে অনেক ধীর হতে পারে।আগ্রহজনকভাবে, এই দুটি স্ক্রিপ্টগুলি পাইথন 2.4 তে আরও বেশি কম্প্যাক্ট ফ্যাশনে কোড করা যেতে পারে এবং পরবর্তীতে নতুন সাজানো বিল্ট-ইন ফাংশন, জেনারেটর এক্সপ্রেশন এবং ফাইল এটারারেটর ব্যবহার করে। নিম্নলিখিতগুলি নিম্নোক্তভাবে একইভাবে কাজ করে যা মূলত কম উৎস-ফাইল রিয়েল এস্টেট সহ:
C:\...\PP4E\System\Streams> type sorterSmall.py
import sys
for line in sorted(sys.stdin): print(line, end='')
C:\...\PP4E\System\Streams> type adderSmall.py
import sys
print(sum(int(line) for line in sys.stdin))
তার যুক্তি অনুসারে, এর পরেরটি একটি জেনারেটর এক্সপ্রেশনকে কাজে লাগায়, যা একটি তালিকা বোঝার মত অনেক, কিন্তু ফলাফলগুলি একবারে একটি ফিরিয়ে দেওয়া হয়, শারীরিক তালিকায় নয়। নেট প্রভাব স্থান অপ্টিমাইজেশান হয়। আরো বিস্তারিত জানার জন্য, মূল ভাষা সংস্থান দেখুন, যেমন বই শেখার পাইথন।

-------------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (২য় খণ্ড)



এই কৌশলটি সাধারণত পাইথন স্ক্রিপ্টগুলির জন্য কাজ করে। এখানে, teststreams.py আবার একটি ফাইল থেকে ইনপুট নেয়। এবং, শেষ অংশ হিসাবে, একটি পাইথন প্রোগ্রামের আউটপুটটি অন্যের ইনপুটের কাছে পাইপ করা হয়- parent (..) ডিরেক্টরিতে আরও বেশি স্ক্রিপ্ট।কিন্তু পূর্ববর্তী more.py কমান্ডে লুকানো একটি সূক্ষ্ম সমস্যা রয়েছে। প্রকৃতপক্ষে, শৃঙ্খলা শুধুমাত্র সৌভাগ্য কামনা করেই কাজ করে: প্রথম স্ক্রিপ্টের আউটপুটটি যদি যথেষ্ট দীর্ঘ হয় তবে ব্যবহারকারীকে যদি এটি অবিরত রাখতে বলা হয় তবে এটি সম্পূর্ণরূপে ব্যর্থ হবে (বিশেষত, যখন ব্যবহারকারীর ইন্টারঅ্যাকশনের জন্য ইনপুট ইওফারর ট্রিগার করে)।
সমস্যাটি হল অতিরিক্ত সংখ্যাগরিষ্ঠ আরো দুটি ডিসজিশনের উদ্দেশ্যে stdin ব্যবহার করে। এটি ইনপুট কল করে স্টডিনে একটি ইন্টারেক্টিভ ব্যবহারকারীর একটি উত্তর পড়ে, কিন্তু এখন এটি স্টুডিনের মূল ইনপুট পাঠ্যকেও গ্রহণ করে। যখন stdin স্ট্রীম সত্যিই একটি ইনপুট ফাইল বা পাইপ থেকে পুনঃনির্দেশিত হয়, আমরা একটি ইন্টারেক্টিভ ব্যবহারকারী থেকে একটি উত্তর ইনপুট করার জন্য এটি ব্যবহার করতে পারবেন না; এটি ইনপুট উৎসের শুধুমাত্র পাঠ্য রয়েছে। তাছাড়া, প্রোগ্রামটি এমনকি শুরু হওয়ার আগেই স্টেডিন পুনঃনির্দেশিত হয়, কমান্ডে পুনঃনির্দেশিত হওয়ার পূর্বে এর অর্থ কী তা বোঝার উপায় নেই।
-----------------------------------------------------------------------------------------------------

পুনঃনির্দেশিত স্ট্রিম এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (১ম খণ্ড)



এর আগে এই বিভাগে, আমরা teststreams.py আউটপুটটিকে আরও বেশি কমান্ডলাইন প্রোগ্রামে পাইপ দিয়ে এই কমান্ড দিয়ে পাইপ করেছিলাম:
C:\...\PP4E\System\Streams> python teststreams.py < input.txt | more
কিন্তু আমরা পূর্ববর্তী অধ্যায়ে পাইথনের আমাদের নিজস্ব "আরও" পেইজিং ইউটিলিটি লিখেছি, কেন স্টেডিন থেকে ইনপুট গ্রহণ করতে সেট আপ করবেন না? উদাহরণস্বরূপ, যদি আমরা পূর্ববর্তী অধ্যায়ের উদাহরণ 2-1 হিসাবে তালিকাভুক্ত আরোপ ফাইলের শেষ তিনটি লাইন পরিবর্তন করি
if __name__ == '__main__': # when run, not when imported
import sys
if len(sys.argv) == 1: # page stdin if no cmd args
more(sys.stdin.read())
else:
more(open(sys.argv[1]).read())
... এটি প্রায়শই মনে হয় যে আমরা teststreams.py এর মানক output_more এর মানক ইনপুটতে পুনঃনির্দেশিত করতে সক্ষম হব:
C:\...\PP4E\System\Streams> python teststreams.py < input.txt | python ..\more.py
Hello stream world
Enter a number>8 squared is 64
Enter a number>6 squared is 36
Enter a number>Bye

Comments