অজগর থেকে কি কনসোলের প্রস্থটি প্রোগ্রামিকভাবে নির্ধারণ করার কোনও উপায় আছে? আমি বোঝাতে চাই এমন অক্ষরের সংখ্যা যা উইন্ডো পিক্সেল প্রস্থ নয় মোড়ানো ছাড়া এক লাইনে ফিট করে।
সম্পাদন করা
লিনাক্সে কাজ করে এমন কোনও সমাধান খুঁজছেন
অজগর থেকে কি কনসোলের প্রস্থটি প্রোগ্রামিকভাবে নির্ধারণ করার কোনও উপায় আছে? আমি বোঝাতে চাই এমন অক্ষরের সংখ্যা যা উইন্ডো পিক্সেল প্রস্থ নয় মোড়ানো ছাড়া এক লাইনে ফিট করে।
সম্পাদন করা
লিনাক্সে কাজ করে এমন কোনও সমাধান খুঁজছেন
উত্তর:
import os
rows, columns = os.popen('stty size', 'r').read().split()
স্টাইটি সাইজ কমান্ডটি ব্যবহার করে যা পাইথন মেলিং তালিকার একটি থ্রেড অনুসারে লিনাক্সে যুক্তিসঙ্গতভাবে সর্বজনীন। এটি ফাইল হিসাবে 'স্টটি সাইজ' কমান্ডটি খুলবে, এটি থেকে 'পড়বে' এবং স্থানাঙ্কগুলি পৃথক করতে একটি সাধারণ স্ট্রিং বিভক্ত ব্যবহার করে।
Os.en পরিবেশ ["COLUMNS"] মানের বিপরীতে (যা আমি আমার স্ট্যান্ডার্ড শেল হিসাবে ব্যাশ ব্যবহার করার পরেও অ্যাক্সেস করতে পারি না) ডেটাও আপ টু ডেট হবে যেখানে আমি বিশ্বাস করি যে os.en পরিবেশ ["COLUMNS"] পাইথন ইন্টারপ্রেটারের প্রবর্তনের সময়টির জন্য মানটি বৈধ হবে (মনে করুন যে ব্যবহারকারী তখন থেকে উইন্ডোটি পুনরায় আকার দিয়েছেন)।
(অজগর 3.3+ এ কীভাবে করা যায় সে সম্পর্কে @ গ্রিংসুয়েভের উত্তর দেখুন)
rows, columns = subprocess.check_output(['stty', 'size']).split()
কিছুটা খাটো, প্লাস সাব প্রসেসটি হ'ল ভবিষ্যত
rows, columns = subprocess.check_output(['stty', 'size']).decode().split()
আপনি যদি পাই 2/3 সামঞ্জস্যের জন্য ইউনিকোড স্ট্রিং চান
এটি মডিউলে কেন রয়েছে তা নিশ্চিত নয় shutil
, তবে এটি আউটপুট টার্মিনালের আকার জিজ্ঞাসা করে পাইথন ৩.৩ এ সেখানে পৌঁছেছে :
>>> import shutil
>>> shutil.get_terminal_size((80, 20)) # pass fallback
os.terminal_size(columns=87, lines=23) # returns a named-tuple
একটি নিম্ন-স্তরের বাস্তবায়ন ওএস মডিউলে রয়েছে। উইন্ডোজেও কাজ করে।
পাইথন ৩.২ এবং নীচে একটি ব্যাকপোর্ট এখন উপলভ্য:
python3.5
ইনস্টল হয়েছে।
Inappropriate ioctl for device
ত্রুটি / সতর্কবার্তা বা 80. সংজ্ঞায়িত ফলব্যাক ভ্যালু পাচ্ছি
ব্যবহার
import console
(width, height) = console.getTerminalSize()
print "Your terminal's width is: %d" % width
সম্পাদনা : ওহ, আমি দুঃখিত। এটি পাইথন স্ট্যান্ডার্ড লিব নয়, এখানে কনসোল.পি এর উত্স রয়েছে (আমি জানি না এটি কোথা থেকে এসেছে)।
মডিউলটি এটির মতো কাজ করে বলে মনে হচ্ছে: এটি 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])
উপরের কোডটি আমার লিনাক্সটিতে সঠিক ফলাফল দেয়নি কারণ উইনসাইজ-স্ট্রাক্টটিতে 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
এইচপি এবং এইচপি পিক্সেল প্রস্থ এবং উচ্চতা থাকতে হবে, কিন্তু না।
fcntl.ioctl(sys.stdin.fileno(), ...
stdout
বা এর stderr
পরিবর্তে stdin
, যদিও। stdin
খুব ভাল একটি পাইপ হতে পারে। আপনি যেমন একটি লাইন যোগ করতে চাইতে পারেন if not os.isatty(0): return float("inf")
।
আমি চারপাশে অনুসন্ধান করেছি এবং এখানে উইন্ডোজগুলির জন্য একটি সমাধান পেয়েছি:
http://code.activestate.com/recipes/440694-determine-size-of-console-window-on-windows/
এবং এখানে লিনাক্স জন্য একটি সমাধান।
সুতরাং এখানে একটি সংস্করণ রয়েছে যা লিনাক্স, ওএস এক্স এবং উইন্ডোজ / সাইগউইন উভয় ক্ষেত্রেই কাজ করে:
""" 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://stackoverflow.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
এটি হয়:
import os
columns, rows = os.get_terminal_size(0)
# or
import shutil
columns, rows = shutil.get_terminal_size()
shutil
ফাংশন প্রায় শুধু একটি মোড়কের হয় os
, যেটা কিছু ত্রুটি ক্যাচ এবং একটি ফলব্যাক সেট আপ কিন্তু এটা এক বিশাল সতর্কীকরণ আছে - এটা যখন বংশীধ্বনিতুল্য বিরতি! এটি একটি বিশাল বিশাল চুক্তি। পরিবর্তে
পাইপিং করার সময় টার্মিনাল আকার পেতে os.get_terminal_size(0)
।
প্রথম যুক্তি 0
হ'ল একটি যুক্তি যা নির্দেশ করে যে স্ট্যান্ডিন ফাইল বর্ণনাকারী ডিফল্ট স্টডআউটের পরিবর্তে ব্যবহার করা উচিত। আমরা স্টিডিন ব্যবহার করতে চাই কারণ স্টাডআউট যখন পাইপ করা হয় তখন নিজেকে বিচ্ছিন্ন করে দেয় যা এই ক্ষেত্রে ত্রুটি উত্থাপন করে।
আমি স্টাডিন আর্গুমেন্টের পরিবর্তে স্টাডআউট ব্যবহার করা কখন কী বোধগম্য হবে এবং এখানে কেন এটি একটি ডিফল্ট তা জানার চেষ্টা করেছি।
os.get_terminal_size()
পাইথন ৩.৩
os.get_terminal_size(0)
যদি আপনি নল stdin ক্র্যাশ হবে। চেষ্টা করুন:echo x | python3 -c 'import os; print(os.get_terminal_size(0))'
পাইথন ৩.৩ থেকে শুরু করে এটি সরাসরি এগিয়ে রয়েছে: https://docs.python.org/3/library/os.html#querying-the-size-of-a-terminal
>>> import os
>>> ts = os.get_terminal_size()
>>> ts.lines
24
>>> ts.columns
80
shutil.get_terminal_size() is the high-level function which should normally be used, os.get_terminal_size is the low-level implementation.
দেখে মনে হচ্ছে যে কোডটির সাথে কিছু সমস্যা আছে, জোহানস:
getTerminalSize
প্রয়োজন import os
env
? মত দেখাচ্ছে os.environ
।এছাড়াও, কেন স্যুইচ lines
এবং cols
ফিরে আসার আগে? যদি TIOCGWINSZ
এবং stty
উভয়ই lines
তখন বলে cols
, আমি বলি যে এটি ছেড়ে দিন। আমি অসম্পূর্ণতা লক্ষ্য করার আগে এটি 10 মিনিটের জন্য আমাকে একটি ভাল বিভ্রান্ত করেছে।
শ্রীধর, আমি আউটপুট পাইপ করার সময় আমি ত্রুটিটি পাই নি। আমি পুরোপুরি নিশ্চিত যে চেষ্টাটি বাদ দিয়ে এটি সঠিকভাবে ধরা হচ্ছে।
পাস্কল, "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)
আপনি এই স্ক্রিপ্টটি কল করার সময় যদি কোনও নিয়ন্ত্রণকারী টার্মিনাল না থাকে তবে এখানে পাইথন 2 বাস্তবায়ন অনেকগুলি ব্যর্থ হবে। এটি আসলে টার্মিনাল কিনা তা নির্ধারণ করতে আপনি sys.stdout.isatty () পরীক্ষা করে দেখতে পারেন, তবে এটি একটি গুচ্ছ কেসকে বাদ দেবে, তাই আমি বিশ্বাস করি যে বিল্টিন কার্স প্যাকেজটি ব্যবহার করে টার্মিনালের আকার নির্ধারণের সবচেয়ে অজগর উপায়।
import curses
w = curses.initscr()
height, width = w.getmaxyx()
আমি এখান থেকে সমাধানটি চেষ্টা করছিলাম যা এখানে কল করে stty size
:
columns = int(subprocess.check_output(['stty', 'size']).split()[1])
তবে এটি আমার পক্ষে ব্যর্থ হয়েছিল কারণ আমি এমন একটি স্ক্রিপ্টে কাজ করছি যা স্টিডিনে পুনঃনির্দেশিত ইনপুট আশা করে এবং stty
অভিযোগ করবে যে "স্টিডিন টার্মিনাল নয়" এই ক্ষেত্রে।
আমি এটিকে এটির মতো কাজ করতে সক্ষম হয়েছি:
with open('/dev/tty') as tty:
height, width = subprocess.check_output(['stty', 'size'], stdin=tty).split()
@ পুনর্নবীটির উত্তরটি ভালভাবে কাজ করে, তবে এতে একটি সমস্যা রয়েছে: os.popen
এখন হ্রাস করা হয়েছে । subprocess
মডিউল পরিবর্তে ব্যবহার করা উচিত, তাই এটি হলো @ reannual এর কোড যে ব্যবহার সম্পর্কে একটি সংস্করণ subprocess
এবং সরাসরি (প্রশ্নের উত্তর একটি সরাসরি কলামের প্রস্থ দিয়ে int
:
import subprocess
columns = int(subprocess.check_output(['stty', 'size']).split()[1])
ওএস এক্স ১০.৯-এ পরীক্ষা করা হয়েছে
চেষ্টা "দোয়া"
আমি খুব একই জিনিস খুঁজছিলাম। এটি ব্যবহার করা খুব সহজ এবং টার্মিনালে রঙিন, স্টাইলিং এবং অবস্থান নির্ধারণের জন্য সরঞ্জাম সরবরাহ করে। আপনার যা প্রয়োজন তা সহজ:
from blessings import Terminal
t = Terminal()
w = t.width
h = t.height
লিনাক্সে কবজির মতো কাজ করে। (আমি ম্যাকোএসএক্সএক্স এবং উইন্ডোজ সম্পর্কে নিশ্চিত নই)
ডাউনলোড এবং ডকুমেন্টেশন এখানে
অথবা আপনি এটি পাইপ দিয়ে ইনস্টল করতে পারেন:
pip install blessings
যদি আপনি পাইথন ৩.৩ বা তার বেশি ব্যবহার করেন তবে আমি বিল্ট-ইনটি get_terminal_size()
ইতিমধ্যে প্রস্তাবিত হিসাবে সুপারিশ করব। তবে আপনি যদি কোনও পুরানো সংস্করণে আটকে থাকেন এবং এটি করার একটি সহজ, ক্রস প্ল্যাটফর্মের উপায় চান, আপনি অ্যাসিমেটিক্স ব্যবহার করতে পারেন । এই প্যাকেজটি পাইথনের সংস্করণগুলিকে ২.7 এ সমর্থন করে এবং বর্তমান টার্মিনাল / কনসোল আকার পেতে উপরে প্রস্তাবিতগুলির অনুরূপ বিকল্পগুলি ব্যবহার করে।
কেবল আপনার Screen
শ্রেণিটি তৈরি করুন এবং dimensions
উচ্চতা এবং প্রস্থটি পেতে সম্পত্তিটি ব্যবহার করুন । এটি লিনাক্স, ওএসএক্স এবং উইন্ডোজে কাজ করার জন্য প্রমাণিত হয়েছে।
ওহ - এবং এখানে সম্পূর্ণ প্রকাশ: আমি লেখক, সুতরাং এটি কাজ করতে যদি আপনার কোনও সমস্যা হয় তবে নির্দ্বিধায় একটি নতুন সমস্যা খুলুন।
এখানে একটি সংস্করণ রয়েছে যা লিনাক্স এবং সোলারিসের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। ম্যাচচাইন থেকে পোস্ট এবং কমিটের ভিত্তিতে । সাবপ্রসেস মডিউলটি প্রয়োজন।
ডিফ টার্মাইজ (): আমদানি শ্লেক্স, সাবপ্রসেস, পুনরায় আউটপুট = সাবপ্রসেস.সেক_আউটপুট (শ্লেক্স.স্প্লিট ('/ বিন / স্টটি -a')) মি = পুনঃ অনুসন্ধান ('সারিগুলি \ ডি + (? পি \ ডি +); কলামগুলি \ ডি + (? পি \ ডি +);', আউটপুট) যদি আমি: এম.আর.আর.পি ('সারি'), এম.গ্রুপ ('কলাম') ফেরত দিন OSError উত্থাপন ('খারাপ প্রতিক্রিয়া:% s'% (আউটপুট))
>>> টার্মাইজ () ('40', '100')