import sys

যেকোন প্রোগ্রামিং ভাষার শক্তিশালী দিক হচ্ছে তার built_in function গুলো। ধরুন, আপনি এমন একটা কাজ করছেন যেখানে সবসময় যোগ-বিয়োগ করা লাগে।

>> >a = 5

>>>b =6

>> >print a + b

11

>> >c = 7

>> >d = 8

>>> print c +d

15

এই কাজগুলো করার জন্য বার বার যোগ কিংবা বিয়োগ লেখাটা একটু বিরক্তিকর। এর চাইতে আপনি যদি একটা ফাংশন তৈরি করে ফেললেন যার কাজ হবে যোগ-বিয়োগ করা তাহলে যখনই যোগ-বিয়োগ করবেন তখন শুধু ফাংশনটা কল করলেই চলবে।

>> >def add_numbers(x,y):

return x + y

>> >a = 5

>> >b =7

>> >print add_number(a,b)

12

>> >print add_number(10,11)

21

এখানে ফাংশনটা আপনাকে নিজেকেই বানাতে হয়েছে। কিন্তু Built_in function এর বেলায় আপনি যখন থেকে প্রোগ্রামিং ল্যাঙ্গুয়েজের  কম্পাইলারটি ইনষ্টল করবেন তখন থেকেই ফাংশনগুলো ব্যবহার করতে পারবেন । পাইথনেও এমন অনেক Built_in function আছে যাদেরকে মডিউল বলা হয়।এসব মডিউলের মাঝে অনেক ধরনের ফাংশন ডিফাইন করা আছে যাদেরকে আপনি প্রয়োজনমত নিজের কাজে ব্যবহার করতে পারবেন।

পাইথেনের মডিউল ব্যবহার করার পদ্ধতিঃ

পাইথনের মডিউল ব্যবহার করার জন্য আপনাকে আগে মডিউলটাকে বর্তমান state এ নিয়ে আসতে হবে। আপনি যখন কোন প্রোগ্রাম রান করছেন বা পাইথনের interpreter টা খুলছেন সেই অবস্থাকে যদি আমরা একটা state হিসেবে ধরলে প্রতিটা state এই আপনাকে মডিউলটাকে ডেকে আনতে হবে। কারণ যতবার আপনি পাইথন থেকে বের হয়ে যাচ্ছেন ততবার আপনার state এর সমাপ্তি ঘটছে। আপনি কী প্রোগ্রাম রান করেছেন, কোন মডিউলটাকে ডেকে এনেছেন তা কম্পিউটারের মেমোরী থেকে মুছে যাচ্ছে।

মডিউল ডেকে আনার জন্য import কমান্ড ব্যবহার করা হয়। যেমন- আমরা একটা পাইথনে interpreter এ একটা মডিউলকে ডেকে আনছি।

>> >import module_name

আপনি চাইলে কোন একটা মডিউল থেকে একটা নির্দিষ্ট পদ্ধতিও ডেকে আনতে পারেন। এক্ষেত্রে কমান্ডটা হবে-

>> >from module_name import method_name

শুধু মডিউল import করলে সব মেথড চলে আসে। সব মেথডসহ মডিউলকে ডাকা আর শুধু একটা পদ্ধতিকে ডাকার মাঝে খুব একটা পার্থক্য নেই। অর্থাত একটাতে বেশি সময় লাগে, আরেকটাতে কম সময় লাগে, এমন কোন ব্যাপার এখানে ঘটে না।

পাইথনের বহুল ব্যবহৃত কিছু মডিউল হল – math, re, sys ইত্যাদি। এই লেখায় আমি sys এর প্রয়োজনীয় কিছু পদ্ধতি নিয়ে লেখার চেষ্টা করব।

প্রথমেই আমরা sys কে আমাদের interpreter এ ডেকে নেই।

>> >import sys

ব্যাস, sys আমাদের সাহায্য করার জন্য চলে আসলো। sys থেকেই বোঝা যাচ্ছে এই মডিউলের কাজ system সম্পর্কিত। অর্থাত সিষ্টেম আউটপুট, ইনপুট, এরর এই মডিউল দিয়ে আমরা নিয়ন্ত্রণ বা বিশ্লেষণ করতে পারব। এখানে উল্লেখ্য যে, আমরা sys এর সব পদ্ধতিই import করেছি।

>>> sys.version()

‘2.7.8 (default, Jun 30 2014, 16:08:48) [MSC v.1500 64 bit (AMD64)]’

এখানে আমরা আমাদের পিসিতে ইনষ্টল করা পাইথনের ভার্সনটা দেখতে পাচ্ছি।
>>> sys.stdout
<open file ‘<stdout>’, mode ‘w’ at 0x0000000001D5A0C0>
>>> sys.stdin
<open file ‘<stdin>’, mode ‘r’ at 0x0000000001D5A0C0>
এখানে আমরা stdin (standard output) আর stdin (standard input) সম্পর্কে জানতে পারছি। যেমন- <open file ‘<stdout>’, mode ‘w’ at 0x0000000001D5A0C0> বোঝাচ্ছে পাইথনের standard output এর mode হচ্ছে write mode। অর্থাৎ print কমান্ডে screen এ যা print করতে বলা হয়েছে তা write করা হবে এবং vice versa.

>>>sys.platform

‘win32’

এখানে, পাইথনকে আমরা যে অপারটেং সিষ্টেমে রান করাচ্ছি তা দেখা যাচ্ছে।
>>> sys.path
[”, ‘C:\\Windows\\system32\\python27.zip’, ‘C:\\Python27\\DLLs’, ‘C:\\Python27\
\lib’, ‘C:\\Python27\\lib\\plat-win’, ‘C:\\Python27\\lib\\lib-tk’, ‘C:\\Python27
‘, ‘C:\\Python27\\lib\\site-packages’]

আমাদের অপারেটিং সিষ্টেমের কোথায় পাইথন ইনষ্টল করা আছে তা একটা লিষ্ট এর element আকারে দেখা যাচ্ছে। আমার এখানে আউটপুট টা একটু জটিল আকারে এসেছে। এখানে পাইথনের প্যাকেজের পথটাও দেখাচ্ছে। প্রাথমিকভাবে শুধু [“C:\\Windows\\system32\\Python27”] অথবা [“usr/bin/python”] আসবে।

>>>  sys.maxsize

9223372036854775807L

এখানে, পাইথনে একটা integer এর সাইজ সর্বোচ্চ কত বড় হতে পারে তা দেখাচ্ছে। পাইথন ৩ থেকে integer এর সাইজ অসীম করে দেওয়া হয়েছে।

>>> sys.getrecursionlimit()

1000

এখানে, আমরা পাইথনের recursion লিমিট দেখতে পাচ্ছি। অর্থাৎ পাইথনে একটা প্রসেস সর্বোচ্চ ১০০০ বার রিপিট করতে পারবে। recursion লিমিট দেওয়া না থাকলে (প্রোগ্রামারের ভুলে লিখে ফেলা) infinite loop এর খপ্পরে পরে পাইথন interpreter crash করত।

এছাড়াও sys মডিউলে অনেক মজার মজার পদ্ধতি রাখা আছে। সব কিছু সম্পর্কে এখানে লেখাটা একটু অসম্ভব (আমার মত অলস মানুষের জন্য এটা আরও কঠিন ) । sys মডিউলে থাকা সব পদ্ধতির লিষ্ট দেখা যাবে নিচের কমান্ডে-

>>> dir(sys)

এবার আমরা sys মডিউল বোঝার জন্য কিছু মজার কোড দেখব।

import sys

print “Coming through stdout”

save_stdout = sys.stdout

fh = open(“test.txt”,”w”)

sys.stdout = fh

print “this line goes to test.txt”

print “hello hello”
sys.stdout = save_stdout

fh.close()

উপরের কোডটাকে যেটা হচ্ছে তা হল- আমরা sys মডিউলটা import করছি এবং সাধারণভাবে print কমান্ড দিয়ে একটা লাইন প্রিন্ট করছি। তারপর standard output system টাকে   save_stdout ভেরিয়েবলটাতে রাখছি। কারণ একটু পরেই আমরা এই standard method টার value পরিবর্তন করব। এরপরে যেটা ঘটছে তা হচ্ছে আমরা একটা ফাইল (write mode এ) ওপেন করে fh ভ্যারিয়েবলে রাখছি। তারপর sys.stdout এবং  fh কে  equivalent করছি ।

তারমানে এখন standar output system এ (print করে) যাই আসবে, তাই fh এ অর্থাৎ আমাদের ওপেন করা ফাইলে চলে যাবে।  তাই পরবর্তীতে যখন আমরা “This line goes to test.txt” প্রিন্ট করছি তখন আসলে লাইনটা test.txt তে সেভ হয়ে যাচ্ছে। চেক করে দেখতে চাইলে নিজের ইচ্ছামত প্রিন্ট করে পরে ফাইলটা ওপেন করে দেখতে পারেন। (আমরা কোডের শেষে fh.close() লিখেছি কারণ কোড থেকে বের হওয়ার আগে ফাইল close না করলে ফাইলে নতুন করে সেভ হওয়া সব ডাটা হারিয়ে যাবে )

একই ঘটনা ঘটছে নিচের কোডটাতে-

import sys

save_stderr = sys.stderr
fh = open(“errors.txt”,”w”)

sys.stderr = fh

x = 10/0

sys.stderr = save_stderr

fh.close()

এখানে আমরা (আগের মত করে) এমনভাবে sys.stderr (standard error) কে ম্যানিপুলেট করেছি যে, কোডের মাঝে কোন error থাকলে তা errors.txt ফাইলে লেখা হয়ে যাচ্ছে।

চাইলে sys.stdin এর জন্য একই ষ্টাইলে কোড লিখে চেক করতে পারেন।

এবার আমরা sys মডিউলের বহুল ব্যবহৃত একটা পদ্ধতি argv নিয়ে আলোচনা করব। নিচের কোডটা খেয়াল করা যাক-

sys_check.py:

import sys

print “script name is”, sys.argv[0]

if len(sys.argv) > 1:
print “there are”, len(sys.argv)-1, “arguments: ”
for arg in sys.argv[1:]:
print arg
else:
print “there are no arguments!”

প্রথমেই একটা কথা বলে রাখি, argv হচ্ছে একটা লিষ্টের মত। এখানে আপনি চাইলে আপনার পছন্দমত অনেকগুলো মান রাখতে পারেন। এবং মজার ব্যাপার হচ্ছে, আপনি মানগুলো কোডটা রান করানোর সময় argument হিসেবে ইনপুট দিতে পারবেন। ব্যাপারটা একটু বিশদভাবে বলি। লেখার শুরুতে  আমরা একটা ফাংশন লিখেছি add নামে। আমরা এই ফাংশনে দুটো মান pass করতাম এবং সে আমাদেরকে এই দুটো মানের যোগফল আউটপুট হিসেবে দিত। এটাকে এভাবে বলা যায় যে আমরা ফাংশনটাতে দুটো argument pass করতাম। argv তে argument pass করার concept টা ঠিক এমনই।

তো আমরা command shell থেকে কোডটা রান করিঃ

C:\Python27>python sys_check.py stream.py 10 11

আউটপুট আসবেঃ

script name is sys_check.py
there are 3 arguments:
stream.py
10
11

এখানে আমরা  কোডটা রান করার সময় ৩ টা argument দিচ্ছি stream.py, 10 এবং 11 . যেহেতু কোডটাতে আমরা sys মডিউলকে import করেছি সেহেতু argument গুলো অটোমেটিক্যালী argv লিষ্টে চলে যাবে।  কোডে আমরা চেক করছি sys.argv এর দৈর্ঘ্য ১ এর চেয়ে বড় কিনা? কারণ ১ এর চেয়ে বড় না হলে বুঝা যায় যে কোন argument pass করা হয় নি, তাই আর বেশি হিসেব নিকেশ এর দরকার নেই।

আমরা অবশ্য ৩ টি  argument pass করছি এবং এতে আমাদের argv এর দৈর্ঘ্য হচ্ছে ৪ ! এমনিতে পাইথনে যেকোন counting/indexing শুরু হয় 0 থেকে, সে হিসেবে দৈর্ঘ্য হওয়ার কথা ২।  ম্যাজিকটা এখানেই, argv এর প্রথম element টা সবসময় হবে যে ফাইলে আমরা sys মডিউল import করছি সেটা। অর্থাৎ argv[0] এর মান হবে sys_check.py যেটা আমরা কোডের ২য় লাইনের আউটপুট থেকে দেখতে পারছি।

এই হল আমাদের sys.argv ।

sys মডিউলের আরেকটা মজার ব্যবহার হচ্ছে কোডের বর্তমান অবস্থা চেক করা।

>>>sys.modules.keys()

এটা আপনাকে আপনার কোডে এখন পর্যন্ত import করা সব মডিউলের লিষ্ট দেখাবে।

>>>sys.getrefcount(variable_name)

getrefcount() আপনাকে জানাবে আপনি আপনার কোডে একটা ভ্যারিয়েবল কতবার ব্যবহার করেছেন। এখানে count টা সবসময় আসল count এর চেয়ে ১ বেশি হবে। কারণ, getrefcount() ও একবার ভ্যারিয়েবলটা ব্যবহার করেছে এবং সে count করার সময় এটাকে সহ count করবে।

এছাড়াও sys মডিউলে আরও অনেক মেথড আছে কিন্তু আমি অলস হওয়ায় এবং সব পদ্ধতি সম্পর্কে এখনও না জানায় আর লিখতে পারলাম না।

>>> import this

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
Md. Noor Faizur Reza
Author: Md. Noor Faizur Reza

আমার যে কাজ ভালো লাগে তা নিয়ে সারাদিন পরে থাকি !

Permanent link to this article: https://www.borgomul.com/rezanur/2942/


মন্তব্য করুন আপনার ফেসবুক প্রোফাইল ব্যবহার করে

মন্তব্য করুন