Python 简单输出基础信息
Python 脚本输出部分基本信息,使用终端截断输出、字符串格式化控制、二次格式化
'{{}}'.format().format()
等。
其实只是想写个 hello world
测试一下 Python 运行环境,然后索性测试一下把 Python 的基础信息试着打印出来。
这个脚本应该只支持 Python3 ,没在 Python2 的运行环境下测试过,不保证在 Python2 的环境下能用。
正文
代码
HelloWorld.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
from datetime import datetime as dt
from os import get_terminal_size as ts
class HelloWorld(object):
@staticmethod
def pt(name:str='', object:any=None):
# python的数据类型有:数字(int)、浮点(float)、字符串(str),列表(list)、元组(tuple)、字典(dict)、集合(set)
size_object = len(object)
print('\n==== {} 总计:{}个 ===='.format(name, size_object))
# dict # isinstance(os.environ, dict) = False
if '__dict__' in dir(object):
index_dict = 0
for key, value in object.items():
if isinstance(value, str):
index_dict += 1
text = ' [{{:>{}d}}/{}] {} : {}'.format(len(str(size_object)), size_object, key, value).format(index_dict)
print(text if len(text) <= ts().columns else (text[:ts().columns - 3] + '...')) # 裁剪输出为单行
# list
elif isinstance(object, list):
index_list = 0
for value in object:
index_list += 1
print(' [{{:>{}d}}/{}] {}'.format(len(str(size_object)), size_object, object[index_list - 1]).format(index_list) )
else:
print('object:{}, type:{}'.format(object, type(object)))
def show(self):
print('Python 路径 : {}'.format(sys.executable))
print('Python 版本 : {}'.format(sys.version))
print('运行路径:{}'.format(os.getcwd()))
print('当前文件:{}'.format(__file__))
print('当前时间:{}'.format(dt.now().strftime(str('%Y-%m-%d %H:%M:%S %f'))))
print('系统平台:{}'.format(sys.platform))
print('终端大小:W{} x H{}'.format(ts().columns, ts().lines))
self.pt(name='启动参数(sys.argv)', object=sys.argv)
self.pt(name='环境变量(os.environ)', object=os.environ)
self.pt(name='系统路径(sys.path)', object=sys.path)
if __name__ == '__main__':
HelloWorld().show()
输出
Python 路径 : /bin/python
Python 版本 : 3.10.5 (main, Jul 28 2022, 04:15:53) [GCC 11.2.0]
运行路径:/home/user/codes/HelloWorld
当前文件:/home/user/codes/HelloWorld/src/HelloWorld.py
当前时间:2023-07-23 06:37:17 933527
系统平台:linux
终端大小:W217 x H28
==== 启动参数(sys.argv) 总计:1个 ====
[0/1] /home/user/codes/HelloWorld/src/HelloWorld.py
==== 环境变量(os.environ) 总计:38个 ====
[ 0/38] SHELL : /bin/bash
[ 1/38] COLORTERM : truecolor
[ 2/38] TERM_PROGRAM_VERSION : 1.74.3
[ 3/38] LANGUAGE : zh_CN
[ 4/38] XDG_DATA_HOME : /home/user/.local/share
[ 5/38] XDG_CONFIG_HOME : /home/user/.config
[ 6/38] PWD : /home/user/codes/HelloWorld
[ 7/38] LOGNAME : user
[ 8/38] XDG_SESSION_TYPE : tty
[ 9/38] VSCODE_GIT_ASKPASS_NODE : /home/user/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/node
[10/38] MOTD_SHOWN : pam
[11/38] HOME : /home/user
[12/38] LANG : zh_CN.UTF-8
[13/38] LS_COLORS : bd=38;5;68;1:ca=38;5;17:cd=38;5;132;1:di=38;5;105:do=38;5;127:ex=38;5;80:pi=38;5;126:fi=38;5;167:ln=38;5;63:mh=38;5;99;1:or=48;5;197;38;5;228;1:ow=38;5;220;1:sg=48;5;234;38;5;100;1:su=38;5;9...
[14/38] GIT_ASKPASS : /home/user/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/extensions/git/dist/askpass.sh
[15/38] SSH_CONNECTION : 192.168.127.1 6504 192.168.127.128 22
[16/38] LINGLONG_ROOT : /persistent/linglong
[17/38] XDG_CACHE_HOME : /home/user/.cache
[18/38] VSCODE_GIT_ASKPASS_EXTRA_ARGS :
[19/38] XDG_SESSION_CLASS : user
[20/38] TERM : xterm-256color
[21/38] USER : user
[22/38] VSCODE_GIT_IPC_HANDLE : /run/user/1000/vscode-git-71d6a8a25c.sock
[23/38] SHLVL : 1
[24/38] XDG_SESSION_ID : 32
[25/38] XDG_RUNTIME_DIR : /run/user/1000
[26/38] SSH_CLIENT : 192.168.127.1 6504 22
[27/38] VSCODE_GIT_ASKPASS_MAIN : /home/user/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/extensions/git/dist/askpass-main.js
[28/38] XDG_DATA_DIRS : /persistent/linglong/entries/share:/home/user/.local/share/linglong/entries/share:/usr/local/share:/usr/share
[29/38] BROWSER : /home/user/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/bin/helpers/browser.sh
[30/38] PATH : /home/user/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/bin/remote-cli:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin
[31/38] DBUS_SESSION_BUS_ADDRESS : unix:path=/run/user/1000/bus
[32/38] OLDPWD : /home/user/codes/HelloWorld
[33/38] TERM_PROGRAM : vscode
[34/38] VSCODE_IPC_HOOK_CLI : /run/user/1000/vscode-ipc-b3187500-b8bc-497e-8864-b01c8bbf12cb.sock
[35/38] _ : /usr/bin/env
[36/38] PYTHONIOENCODING : UTF-8
[37/38] PYTHONUNBUFFERED : 1
==== 系统路径(sys.path) 总计:7个 ====
[0/7] /home/user/codes/HelloWorld/src
[1/7] /usr/lib/python310.zip
[2/7] /usr/lib/python3.10
[3/7] /usr/lib/python3.10/lib-dynload
[4/7] /home/user/.local/lib/python3.10/site-packages
[5/7] /usr/local/lib/python3.10/dist-packages
[6/7] /usr/lib/python3/dist-packages
知识点
基础知识
coding: UTF-8
:标明当前文件的编码,防止中文输出错误;if __name__ == '__main__'
:当前模块为主模块时执行;from datetime import datetime as dt
:导入模块的子模块并起别名;'{}'.format(XXX)
:字符串格式化的形式有多种,这种形式基本上不需要手动进行类型转换,比较方便;datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %f')
:格式化输出时间字符串,总是忘记,这里做个备忘;os.get_terminal_size().columns
和os.get_terminal_size().lines
:获取终端窗口支持显示的文本宽高数;sys.argv
:命令行参数都在这里面;os.environ
或os.getenv(XXX)
:获取环境变量信息;{:>4d}
:格式化字符串,占用4字符宽度,不足部分使用空格填充;AAA = BBB if CCC else DDD
:三目表达式, 使用 ‘BBB’ 对 ‘AAA’ 赋值,如果条件 ‘CCC’ 成立,那么就用 ‘DDD’ 对 ‘AAA’ 赋值;[:N]
:数组截取,表示截取到第N个下标,常见的还有sys.argv[1:]
,表示从序号为1(第2个)的参数开始一直到结束。
部分设计
设计上有几个地方可能需要解释一下,
-
print(text if len(text) <= ts().columns else (text[:ts().columns - 3] + '...'))
:
部分环境变量的值比较长,而作为 ‘HelloWorld’ 程序不需要这么长的信息,此处设计为非换行输出,超过单行显示就截断,并在后面添加...
以标明这是不完整的输出。
因为是 KV 型的内容, V 在最后,比较简单,因此为了简化计算,直接拼接长字符串进行截断显示。
该语句意为:如果text
字符长度小于等一终端宽度,那么对text
不截断进行完整输出,否则多截断出...
的宽度 -
'[{{:>{}d}}/{}] {} : {}'.format(len(str(size_object)), size_object, key, value).format(index_dict)
:
{{
和}}
可表示{
和}
,{{AAA}}.format(AAA='BBB')
可生成{BBB}
,后面跟.format
可对生成结果进行再次格式化。
所以以上语句实际形式为:'XXX'.format(YYY).format(ZZZ)
,进行了两次字符串格式化。
第一次格式化后的字符串为:'[{:>2d}/38] KEY : VALUE'
,使用该字符串进行'[{:>2d}/38] KEY : VALUE'.format(index_dict)
即可生成目标字符串'[ 1/38] KEY : VALUE'
。 -
str(len(str(len(object))))
:
以object
为数组时举例,len(object)
表示这个数组内元素的个数,str(len(object))
转换为字符串以便计算显示宽度,len(str(len(object)))
表示在终端上的显示宽度,str(len(str(len(object))))
表示以字符串形式输出object
元素个数的显示宽度。