python - পাইথন ভাষায় ডিকশনারি কেন ব্যবহার করা হয়




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

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

import subprocess

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

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

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

সম্পাদন করা

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


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

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

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


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

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

উপরের কোডটি আমার লিনাক্সে সঠিক ফলাফলটি ফেরত দেয়নি কারণ 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

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


এখানে একটি সংস্করণ যা 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')

এটা হয়:

import os
columns, rows = os.get_terminal_size(0)
# or
import shutil
columns, rows = shutil.get_terminal_size()

shutil ফাংশনটি কেবলমাত্র একটি চারপাশের একটি shutil যা কিছু ত্রুটি ধরে রাখে এবং একটি shutil সেট আপ করে, তবে এটিতে একটি বিশাল সতর্কতা রয়েছে - এটি পাইপিংয়ের সময় বিরতি দেয়! , যা একটি সুন্দর বিশাল চুক্তি।
পাইপ ব্যবহার করার সময় টার্মিনাল আকার পেতে os.get_terminal_size(0) পরিবর্তে।

প্রথম যুক্তি 0 হল একটি যুক্তি যা নির্দেশ করে যে ডিফল্ট stdout পরিবর্তে stdin ফাইল বর্ণনাকারী ব্যবহার করা উচিত। আমরা stdin ব্যবহার করতে চাই কারণ stdout যখন এটি পাইপ করা হচ্ছে তখন নিজেই এটি পৃথক হয় যা এই ক্ষেত্রে উত্থাপন করে একটি ত্রুটি বাড়ায়।
আমি stdin যুক্তিটির পরিবর্তে stdout ব্যবহার করার অর্থ বুঝতে এবং এটি কোনও ডিফল্ট কেন তা উপলব্ধি করার কোনও ধারণা নেই।


দেখে মনে হচ্ছে যে সেই কোডটির সাথে কিছু সমস্যা রয়েছে, জোহানস:

  • getTerminalSize import os করতে হবে
  • env কি? os.environ মত os.environ

এছাড়াও, কেন ফিরে lines এবং cols সুইচ আগে? যদি TIOCGWINSZ এবং stty উভয় lines তারপর stty বলে, আমি বলে যে উপায় ছেড়ে। আমি অসঙ্গতি লক্ষ্য করেছি আগে 10 মিনিটের জন্য এটি আমাকে বিভ্রান্ত করেছিল।

শ্রীধর, আমি আউটপুট পাইপ যখন আমি যে ত্রুটি পাবেন না। আমি নিশ্চিত যে এটি সঠিকভাবে চেষ্টা ছাড়া ধরা হচ্ছে।

"HHHH" , "HHHH" আমার মেশিনে কাজ করে না, কিন্তু "hh" । আমি যে ফাংশন জন্য ডকুমেন্টেশন খুঁজে পেতে সমস্যা ছিল। এটি প্ল্যাটফর্ম নির্ভরশীল মনে হচ্ছে।

chochem, অন্তর্ভুক্ত।

এখানে আমার সংস্করণ:

def getTerminalSize():
    """
    returns (lines:int, cols:int)
    """
    import os, struct
    def ioctl_GWINSZ(fd):
        import fcntl, termios
        return struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234"))
    # try stdin, stdout, stderr
    for fd in (0, 1, 2):
        try:
            return ioctl_GWINSZ(fd)
        except:
            pass
    # try os.ctermid()
    try:
        fd = os.open(os.ctermid(), os.O_RDONLY)
        try:
            return ioctl_GWINSZ(fd)
        finally:
            os.close(fd)
    except:
        pass
    # try `stty size`
    try:
        return tuple(int(x) for x in os.popen("stty size", "r").read().split())
    except:
        pass
    # try environment variables
    try:
        return tuple(int(os.getenv(var)) for var in ("LINES", "COLUMNS"))
    except:
        pass
    # i give up. return default.
    return (25, 80)


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

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

from blessings import Terminal

t = Terminal()

w = t.width
h = t.height

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

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

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

pip install blessings

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

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

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







width