python যবহ কিভাবে পাইথন মধ্যে লিনাক্স কনসোল উইন্ডো প্রস্থ পেতে




পাইথন ভাষায় ডিকশনারি কেন ব্যবহার করা হয় (12)

প্রোগ্রামনগতভাবে কনসোল প্রস্থ নির্ধারণ করতে Python একটি উপায় আছে? আমি মানে অক্ষরের সংখ্যা যা এক লাইনে মোড়ানো ছাড়া ফিট করে, উইন্ডোটির পিক্সেল প্রস্থ নয়।

সম্পাদন করা

লিনাক্সে কাজ করে এমন একটি সমাধান খুঁজছেন


@ রেনুয়ালুর উত্তরটি ভাল কাজ করে, তবে এর সাথে একটি সমস্যা রয়েছে: os.popen এখন os.popen । এর পরিবর্তে subprocess মডিউলটি ব্যবহার করা উচিত, তাই এখানে @ রেনানুয়াল কোডের একটি সংস্করণ যা সাবপ্রোসেস ব্যবহার subprocess এবং সরাসরি প্রশ্নের উত্তর দেয় (কলামের প্রস্থটি সরাসরি একটি int হিসাবে প্রদান করে:

import subprocess

columns = int(subprocess.check_output(['stty', 'size']).split()[1])

ওএস এক্স 10.9 পরীক্ষিত


এখানে একটি সংস্করণ যা Linux এবং Solaris সামঞ্জস্যপূর্ণ হওয়া উচিত। madchine থেকে পোস্ট এবং commments উপর ভিত্তি করে। Subprocess মডিউল প্রয়োজন।

def termsize():
    import shlex, subprocess, re
    output = subprocess.check_output(shlex.split('/bin/stty -a'))
    m = re.search('rows\D+(?P\d+); columns\D+(?P\d+);', output)
    if m:
        return m.group('rows'), m.group('columns')
    raise OSError('Bad response: %s' % (output))
>>> termsize()
('40', '100')

আমি কাছাকাছি অনুসন্ধান এবং উইন্ডোজ জন্য একটি সমাধান খুঁজে পাওয়া যায় নি:

http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/

এবং এখানে linux জন্য একটি সমাধান।

তাই এখানে একটি সংস্করণ যা লিনাক্স, ওএস এক্স এবং উইন্ডোজ / সাইগুইন উভয় কাজ করে:

""" getTerminalSize()
 - get width and height of console
 - works on linux,os x,windows,cygwin(windows)
"""

__all__=['getTerminalSize']


def getTerminalSize():
   import platform
   current_os = platform.system()
   tuple_xy=None
   if current_os == 'Windows':
       tuple_xy = _getTerminalSize_windows()
       if tuple_xy is None:
          tuple_xy = _getTerminalSize_tput()
          # needed for window's python in cygwin's xterm!
   if current_os == 'Linux' or current_os == 'Darwin' or  current_os.startswith('CYGWIN'):
       tuple_xy = _getTerminalSize_linux()
   if tuple_xy is None:
       print "default"
       tuple_xy = (80, 25)      # default value
   return tuple_xy

def _getTerminalSize_windows():
    res=None
    try:
        from ctypes import windll, create_string_buffer

        # stdin handle is -10
        # stdout handle is -11
        # stderr handle is -12

        h = windll.kernel32.GetStdHandle(-12)
        csbi = create_string_buffer(22)
        res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi)
    except:
        return None
    if res:
        import struct
        (bufx, bufy, curx, cury, wattr,
         left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
        sizex = right - left + 1
        sizey = bottom - top + 1
        return sizex, sizey
    else:
        return None

def _getTerminalSize_tput():
    # get terminal width
    # src: http://.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window
    try:
       import subprocess
       proc=subprocess.Popen(["tput", "cols"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
       output=proc.communicate(input=None)
       cols=int(output[0])
       proc=subprocess.Popen(["tput", "lines"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
       output=proc.communicate(input=None)
       rows=int(output[0])
       return (cols,rows)
    except:
       return None


def _getTerminalSize_linux():
    def ioctl_GWINSZ(fd):
        try:
            import fcntl, termios, struct, os
            cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,'1234'))
        except:
            return None
        return cr
    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
    if not cr:
        try:
            fd = os.open(os.ctermid(), os.O_RDONLY)
            cr = ioctl_GWINSZ(fd)
            os.close(fd)
        except:
            pass
    if not cr:
        try:
            cr = (env['LINES'], env['COLUMNS'])
        except:
            return None
    return int(cr[1]), int(cr[0])

if __name__ == "__main__":
    sizex,sizey=getTerminalSize()
    print  'width =',sizex,'height =',sizey

"আশীর্বাদ" চেষ্টা করুন

আমি খুব একই জিনিস খুঁজছেন ছিল। এটি ব্যবহার করা খুব সহজ এবং টার্মিনালে রঙ, স্টাইলিং এবং অবস্থানের জন্য সরঞ্জাম সরবরাহ করে। আপনার যা প্রয়োজন তা সহজ:

from blessings import Terminal

t = Terminal()

w = t.width
h = t.height

লিনাক্সে একটি কবজ মত কাজ করে। (আমি ম্যাক্সএক্স এবং উইন্ডোজ সম্পর্কে নিশ্চিত নই)

here ডাউনলোড করুন এবং ডকুমেন্টেশন

অথবা আপনি পিপ দিয়ে এটি ইনস্টল করতে পারেন:

pip install blessings

ব্যবহার

import console
(width, height) = console.getTerminalSize()

print "Your terminal's width is: %d" % width

সম্পাদনা করুন : ওহ, আমি দুঃখিত। এটি একটি পাইথন স্ট্যান্ডার্ড লিব নয়, এখানে console.py এর উত্স (আমি এটি কোথা থেকে এসেছি তা জানি না)।

মডিউলটি এভাবে কাজ করে বলে মনে হচ্ছে: এটি যখন termcap উপলব্ধ থাকে, তখন হ্যাঁ তা পরীক্ষা করে। এটা যে ব্যবহার করে; টার্মিনাল একটি বিশেষ ioctl কল সমর্থন করে কিনা এবং এটি কাজ করে না তা পরীক্ষা করে না, তাও, এটি পরিবেশের ভেরিয়েবলগুলির জন্য কিছু শেল রপ্তানি করার জন্য পরীক্ষা করে। এই সম্ভবত ইউনিক্স শুধুমাত্র কাজ করবে।

def getTerminalSize():
    import os
    env = os.environ
    def ioctl_GWINSZ(fd):
        try:
            import fcntl, termios, struct, os
            cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,
        '1234'))
        except:
            return
        return cr
    cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
    if not cr:
        try:
            fd = os.open(os.ctermid(), os.O_RDONLY)
            cr = ioctl_GWINSZ(fd)
            os.close(fd)
        except:
            pass
    if not cr:
        cr = (env.get('LINES', 25), env.get('COLUMNS', 80))

        ### Use get(key[, default]) instead of a try/catch
        #try:
        #    cr = (env['LINES'], env['COLUMNS'])
        #except:
        #    cr = (25, 80)
    return int(cr[1]), int(cr[0])

আপনি যদি Python 3.3 বা উপরে ব্যবহার করেন তবে আমি ইতিমধ্যেই সুপারিশকৃত অন্তর্নির্মিত get_terminal_size() সুপারিশ করব। তবে যদি আপনি পুরোনো সংস্করণে আটকে থাকেন এবং এটি করার জন্য একটি সহজ, ক্রস-প্ল্যাটফর্মের উপায় চান তবে আপনি asciimatics ব্যবহার করতে পারেন। এই প্যাকেজটি পাইথনের সংস্করণগুলিকে 2.7 তে সমর্থন করে এবং বর্তমান টার্মিনাল / কনসোল আকার পেতে উপরের প্রস্তাবিত বিকল্পগুলি ব্যবহার করে।

শুধু আপনার Screen ক্লাসটি গঠন করুন এবং উচ্চতা এবং প্রস্থ পেতে dimensions সম্পত্তি ব্যবহার করুন। এই লিনাক্স, ওএসএক্স এবং উইন্ডোজ কাজ করতে প্রমাণিত হয়েছে।

ওহ - এবং সম্পূর্ণ প্রকাশ এখানে: আমি লেখক, তাই যদি আপনি এই কাজ পেতে কোন সমস্যা আছে, তাহলে একটি নতুন সমস্যা খুলতে বিনা দ্বিধায় দয়া করে।


উপরের কোডটি আমার লিনাক্সে সঠিক ফলাফলটি ফেরত দেয়নি কারণ winsize-struct এর 4 টি স্বাক্ষরিত শর্টস, 2 স্বাক্ষরযুক্ত শর্টস নয়:

def terminal_size():
    import fcntl, termios, struct
    h, w, hp, wp = struct.unpack('HHHH',
        fcntl.ioctl(0, termios.TIOCGWINSZ,
        struct.pack('HHHH', 0, 0, 0, 0)))
    return w, h

এইচপি এবং এইচপি পিক্সেল প্রস্থ এবং উচ্চতা থাকা উচিত, কিন্তু না।


আমি এখানে এমন সমাধানটি চেষ্টা করছিলাম যা stty size কল করে:

columns = int(subprocess.check_output(['stty', 'size']).split()[1])

তবে এটি আমার জন্য ব্যর্থ হয়েছে কারণ আমি stty পুনঃনির্দেশিত ইনপুট আশা করি এমন একটি স্ক্রিপ্টে কাজ stty এবং stty অভিযোগ করেছিল যে " stty কোনও টার্মিনাল নয়"।

আমি এটা ভালো কাজ করতে সক্ষম ছিল:

with open('/dev/tty') as tty:
    height, width = subprocess.check_output(['stty', 'size'], stdin=tty).split()


import os
rows, columns = os.popen('stty size', 'r').read().split()

'স্ট্টি সাইজ' কমান্ডটি ব্যবহার করে যা পাইথন মেইলিং লিস্টের একটি থ্রেড অনুযায়ী লিনাক্সে যুক্তিসঙ্গতভাবে সার্বজনীন। এটি 'স্ট্টি সাইজ' কমান্ডটি একটি ফাইল হিসাবে খুলবে, এটি থেকে 'পড়বে' এবং সমন্বয়গুলি আলাদা করার জন্য একটি সহজ স্ট্রিং বিভক্ত ব্যবহার করবে।

Os.environ ["COLUMNS"] মানের থেকে ভিন্ন (যা আমি আমার স্ট্যান্ডার্ড শেল হিসাবে ব্যাশ ব্যবহার করে অ্যাক্সেস করতে পারি না) তথ্যটি আপ-টু-ডেট থাকবে যখন আমি বিশ্বাস করব যে os.environ ["COLUMNS"] মান শুধুমাত্র পাইথন ইন্টারপ্রেটারের লঞ্চের সময় বৈধ হবে (ধরুন ব্যবহারকারী তখন থেকে উইন্ডোটি পুনরায় আকার করে)।


কেন এটি মডিউল shutil তা নিশ্চিত নয়, তবে এটি পাইথন 3.3 তে shutil , আউটপুট টার্মিনালের shutil :

>>> import shutil
>>> shutil.get_terminal_size((80, 20))  # pass fallback
os.terminal_size(columns=87, lines=23)  # returns a named-tuple

একটি নিম্ন স্তরের বাস্তবায়ন os মডিউল হয়।

পাইথন 3.2 এবং তারপরে একটি ব্যাকপোর্ট এখন উপলব্ধ:


এই স্ক্রিপ্টটি কল করার সময় এখানে কোনও নিয়ন্ত্রণকারী টার্মিনাল থাকলে পাইথন 2 প্রয়োগগুলির অনেকগুলি ব্যর্থ হবে। আপনি sysstdout.isatty () টি দেখতে পারেন কিনা এটি আসলে একটি টার্মিনাল কিনা তা নির্ধারণ করতে পারে, তবে এটি একটি গোষ্ঠীগুলিকে বাদ দেবে, তাই আমি বিশ্বাস করি যে টার্মিনাল আকারটি খুঁজে বের করার সবচেয়ে পাইথনিক উপায় হল বিল্টিন শ্যাস প্যাকেজটি ব্যবহার করা।

import curses
w = curses.initscr()
height, width = w.getmaxyx()




width