sys模块

sys模块能帮助程序员访问与python解释器联系紧密的变量和函数。

sys.argv:命令行参数List,第一个元素是程序本身路径

常用来处理脚本执行输入参数。

#:Desktop hqs$ cat test.py 
import sys
print(sys.argv)
#:Desktop hqs$ python test.py run web
['test.py', 'run', 'web']
#:Desktop hqs$ python /Users/hqs/Desktop/test.py run web
['/Users/hqs/Desktop/test.py', 'run', 'web']
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 将系统目录添加到环境变量
sys.path.append(BASE_DIR)

if __name__ == '__main__':
    from core import management
    # sys.argv:命令行参数List,第一个元素是程序本身路径
    argv_parser = management.ManagementTool(sys.argv)
    argv_parser.execute()  # 解析并执行指令
from core import main

class ManagementTool(object):
    """对用户输入的指令进行解析并调用相应模块进行处理"""
    def __init__(self, sys_argv):
        """构造函数"""
        self.sys_argv = sys_argv   # [createuser alex]
        print(self.sys_argv)
        self.verify_argv()

    def verify_argv(self):
        """
        验证指令是否合法
        python  ftp_server.py  start
        """
        """验证指令数量"""
        if len(self.sys_argv) < 2:
            self.help_msg()   # 打印帮助信息
        cmd = self.sys_argv[1]
        # 反射的理解
        if not hasattr(self, cmd):  # 判断obj内有没有cmd属性
            """没有sys_argv[1]对应的这个命令,打印报错和帮助信息"""
            print('invalid argument')
            self.help_msg()

    def help_msg(self):
        """帮助信息"""
        msg = """
        start     start  FTP server
        stop      stop   FTP server
        restart   restart FTP server
        createuser username   create FTP user
        """
        exit(msg)  # 退出并打印

    def execute(self):
        """解析并执行指令"""
        cmd = self.sys_argv[1]
        func = getattr(self, cmd)
        func()

    def start(self):
        """start ftp server"""
        server = main.FTPServer(self)  # 传参self实现management对象传入FTPServer类
        server.run_forever()

    def createuser(self):
        print(self.sys_argv)  # 直接拿数据,不需要传参数

执行入口程序:python  start.py  -h 127.0.0.1  -p 3308  start, 返回控制台信息:

['ftp_server.py', '-h', '127.0.0.1', '-p', '3308', 'start']
invalid argument

        start     start  FTP server
        stop      stop   FTP server
        restart   restart FTP server
        createuser username   create FTP user

 

sys.exit:退出当前程序,可选参数为给定的返回值或错误信息

#:Desktop hqs$ cat test.py 
# -*- coding:utf-8 -*-
import sys
print(sys.argv)
sys.exit('执行失败,退出程序!')
print("check exit() function")     # 后面的语句不再执行

#:Desktop hqs$ python test.py 
['test.py']
执行失败,退出程序

sys.version:python解释器的版本信息

>>> import sys
>>> sys.version
'2.7.10 (default, Jul 15 2017, 17:16:57) \n[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)]'

sys.path:查找模块所在目录的目录名列表(模块搜索路径,初始化时使用pythonPATH环境变量的值)

    它是一个字符串列表,其中的每一个字符串都是一个目录名,在import语句执行时,解释器就会从这些目录中查找模块。

>>> sys.path
['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Library/Python/2.7/site-packages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC']

sys.maxsize:最大的int值(python2中是sys.maxint)

>>> sys.maxsize
9223372036854775807

sys.platform:输出一个字符串,是解释器正在其上运行的“平台”名称。一般是操作系统名称,如果是Jpython则是JAVA虚拟机

>>> sys.platform
'darwin'

sys.stdin、sys.stdout、sys.stderr模块变量是类文件流对象。表示标准UNIX概念中的标准输入、标准输出和标准错误。

>>> sys.stdout  # 将屏幕作为一个文件(一个类文件对象file-like)
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
>>> sys.stdout.write('hey!good morning!')
hey!good morning!17
>>> sys.stdin.read()  # 一直读
asdadd
asdad^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>> sys.stdin.readline()  # 读一行
asdadad
'asdadad\n'

递归相关的函数:

sys.getrecursionlimit()  # 获取最大递归层数  默认是1000(0-999)
sys.setrecursionlimit(1200)  # 设置最大递归层数

编码相关函数:

>>> sys.getdefaultencoding()   # 获取解释器默认编码
'utf-8'
>>> sys.getfilesystemencoding()   # 获取内存数据存到文件里的默认编码
'utf-8'

 

posted @ 2018-04-04 11:18  休耕  阅读(342)  评论(0编辑  收藏  举报