Python 简单输出基础信息

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

知识点

基础知识

  1. coding: UTF-8:标明当前文件的编码,防止中文输出错误;
  2. if __name__ == '__main__':当前模块为主模块时执行;
  3. from datetime import datetime as dt:导入模块的子模块并起别名;
  4. '{}'.format(XXX):字符串格式化的形式有多种,这种形式基本上不需要手动进行类型转换,比较方便;
  5. datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S %f'):格式化输出时间字符串,总是忘记,这里做个备忘;
  6. os.get_terminal_size().columnsos.get_terminal_size().lines:获取终端窗口支持显示的文本宽高数;
  7. sys.argv:命令行参数都在这里面;
  8. os.environos.getenv(XXX):获取环境变量信息;
  9. {:>4d}:格式化字符串,占用4字符宽度,不足部分使用空格填充;
  10. AAA = BBB if CCC else DDD:三目表达式, 使用 ‘BBB’ 对 ‘AAA’ 赋值,如果条件 ‘CCC’ 成立,那么就用 ‘DDD’ 对 ‘AAA’ 赋值;
  11. [:N]:数组截取,表示截取到第N个下标,常见的还有 sys.argv[1:],表示从序号为1(第2个)的参数开始一直到结束。

部分设计

设计上有几个地方可能需要解释一下,

  1. print(text if len(text) <= ts().columns else (text[:ts().columns - 3] + '...'))
    部分环境变量的值比较长,而作为 ‘HelloWorld’ 程序不需要这么长的信息,此处设计为非换行输出,超过单行显示就截断,并在后面添加 ... 以标明这是不完整的输出。
    因为是 KV 型的内容, V 在最后,比较简单,因此为了简化计算,直接拼接长字符串进行截断显示。
    该语句意为:如果 text 字符长度小于等一终端宽度,那么对 text 不截断进行完整输出,否则多截断出 ... 的宽度

  2. '[{{:>{}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'

  3. str(len(str(len(object))))
    object 为数组时举例,len(object)表示这个数组内元素的个数,str(len(object))转换为字符串以便计算显示宽度,len(str(len(object)))表示在终端上的显示宽度,str(len(str(len(object))))表示以字符串形式输出object元素个数的显示宽度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值