Python系统交互库解析过程

作者:

文章目录
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Python使用Plotly制作交互式图表的操作指南 一文教你如何使用python编写交互式.exe程序 使用Python进行数据库交互的实践指南(从SQL查询到ORM操作) Python与Java交互出现乱码的问题解决 Python与Java进行交互操作的方法与性能对比 使用Python打造交互式图片管理器
  • 目录
    • 系统交互库
      • os 模块
      • sys 模块
      • subprocess 模块
    • 远程管理工具
      • paramiko 库
      • Fabric 工具
    • 网络通信库
      • socket 模块
      • requests 库
    • 数据处理工具
      • json 模块
      • csv 模块
      • yaml 模块
    • 总结

      os 模块提供了跨平台的文件和目录操作方法,是 Python 标准库中最常用的系统接口之一:

      文件操作

      • os.rename(src, dst) – 重命名文件或目录
      • os.remove(path) – 删除文件(不能删除目录)

      os.path 子模块提供:

      • os.path.exists(path) – 检查路径是否存在
      • os.path.isfile(path)/os.path.isdir(path) – 判断路径类型
      • os.path.getsize(path) – 获取文件大小

      目录操作

      • os.mkdir(path) – 创建单个目录
      • os.makedirs(path) – 递归创建多级目录
      • os.listdir(path) – 列出目录内容
      • os.chdir(path) – 改变当前工作目录
      • os.walk(top) – 目录树生成器,递归遍历

      路径处理

      • os.path.join(path1, path2) – 智能拼接路径(跨平台兼容)
      • os.path.abspath(path) – 获取绝对路径
      • os.path.dirname(path)/os.path.basename(path) – 获取目录名/文件名
      • os.path.splitext(path) – 分离文件名和扩展名

      系统信息

      • os.name – 操作系统名称('posix', 'nt', 'java')
      • os.environ – 环境变量字典
      • os.getcwd() – 获取当前工作目录
      • os.cpu_count() – 获取CPU核心数

      sys 模块实现了与 Python 解释器的深度交互:

      命令行参数

      • sys.argv – 脚本参数列表(第一个元素是脚本名称)
      • 示例:python script.py arg1 arg2sys.argv = ['script.py', 'arg1', 'arg2']

      模块搜索路径

      • sys.path – Python 模块搜索路径列表
      • 可动态修改:sys.path.append('/custom/path')

      标准输入输出

      • sys.stdin/sys.stdout/sys.stderr – 标准 I/O 流对象
      • 重定向示例:
      sys.stdout = open('output.log', 'w')
      print("这将写入文件")
      

      解释器信息

      • sys.version – Python 版本信息
      • sys.platform – 操作系统平台标识符
      • sys.executable – Python 解释器路径
      • sys.exit([status]) – 退出程序(0表示成功)

      其他重要功能

      • sys.getsizeof(obj) – 获取对象占用的内存大小
      • sys.getrecursionlimit() – 获取递归深度限制
      • sys.settrace() – 设置跟踪函数用于调试

      subprocess 提供了更安全的进程管理方式,替代传统的 os.system():

      基本用法

      # 运行简单命令
      result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
      print(result.stdout)
      
      # 检查返回码
      if result.returncode != 0:
          print("命令执行失败")
      

      高级控制

      • subprocess.Popen() – 创建子进程并返回句柄
      proc = subprocess.Popen(["python", "worker.py"], 
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE)
      

      管道连接

      • subprocess.PIPE – 创建管道
      p1 = subprocess.Popen(["cat", "file.txt"], stdout=subprocess.PIPE)
      p2 = subprocess.Popen(["grep", "keyword"], stdin=p1.stdout, stdout=subprocess.PIPE)
      

      错误处理

      • subprocess.CalledProcessError – 命令返回非零状态时抛出
      • 安全执行:
      try:
          subprocess.run(["rm", "important_file"], check=True)
      except subprocess.CalledProcessError as e:
          print(f"命令失败: {e}")
      

      其他功能

      • timeout 参数 – 设置命令超时时间
      • shell=True – 通过系统shell执行命令(有安全风险)
      • env 参数 – 设置子进程环境变量

      paramiko 是纯 Python 实现的 SSHv2 协议库:

      SSH 连接

      import paramiko
      
      client = paramiko.SSHClient()
      client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
      client.connect('hostname', username='user', password='pass')
      

      执行命令

      stdin, stdout, stderr = client.exec_command('ls -l')
      print(stdout.read().decode())
      

      文件传输

      sftp = client.open_sftp()
      sftp.put('local.txt', 'remote.txt')  # 上传
      sftp.get('remote.txt', 'local.txt')  # 下载
      sftp.close()
      

      密钥认证

      key = paramiko.RSAKey.from_private_key_file('/path/to/key.pem')
      client.connect('host', username='user', pkey=key)
      

      高级功能

      • SSH 隧道
      • 保持连接
      • 主机密钥验证
      • 交互式 shell

      Fabric2 是新一代的批量任务框架,构建在 Paramiko 之上:

      任务定义

      from fabric import task
      
      @task
      def deploy(c):
          c.run('git pull')
          c.run('pip install -r requirements.txt')
      

      主机管理

      @task
      def check_disk(c):
          # 单个连接
          result = c.run('df -h', hide=True)
          print(f"磁盘使用:n{result.stdout}")
          
          # 多主机
          for connection in c:
              with connection.cd('/var/log'):
                  connection.run('ls -l')
      

      批量执行

      from fabric import Connection, ThreadingGroup
      
      hosts = ['web1', 'web2', 'db1']
      group = ThreadingGroup(*hosts, user='admin')
      
      result = group.run('hostname')
      for connection, result in result.items():
          print(f"{connection.host}: {result.stdout.strip()}")
      

      配置系统

      • fabric.yml 配置文件:
      user: deploy
      connect_kwargs:
        key_filename: /path/to/key.pem
      hosts:
        - web1.example.com
        - web2.example.com
      
      • 或通过 Python 配置:
      c = Connection('host', user='user', connect_kwargs={'password': 'pass'})
      

      其他特性

      • 并行执行
      • 失败处理
      • 上下文管理器
      • 本地和远程操作混合

      socket 提供底层网络接口:

      TCP 通信

      # 服务器端
      server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      server_socket.bind(('0.0.0.0', 8000))
      server_socket.listen(1)
      conn, addr = server_socket.accept()
      
      # 客户端
      client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      client_socket.connect(('localhost', 8000))
      

      UDP 通信

      # 服务器端
      udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      udp_socket.bind(('0.0.0.0', 8000))
      data, addr = udp_socket.recvfrom(1024)
      
      # 客户端
      udp_socket.sendto(b'Hello', ('localhost', 8000))
      

      常用方法

      • socket.settimeout() – 设置超时时间
      • socket.getaddrinfo() – 地址解析
      • socket.gethostname() – 获取主机名
      • socket.shutdown() – 优雅关闭连接

      高级功能

      • 非阻塞 I/O
      • 套接字选项设置
      • 多路复用 (select/poll)
      • SSL 包装

      requests 提供了人性化的 HTTP 客户端:

      简单请求

      # GET 请求
      response = requests.get('https://api.example.com/data')
      print(response.json())
      
      # POST 请求
      payload = {'key1': 'value1', 'key2': 'value2'}
      response = requests.post('https://api.example.com/post', data=payload)
      

      参数传递

      • params – URL 查询参数
      requests.get('https://api.example.com/search', params={'q': 'python'})
      
      • json – JSON 请求体
      requests.post('https://api.example.com/data', json={'key': 'value'})
      

      会话保持

      session = requests.Session()
      session.get('https://example.com/login', auth=('user', 'pass'))
      response = session.get('https://example.com/dashboard')
      

      高级功能

      • 代理支持:
      proxies = {'http': 'http://proxy.example.com:8080'}
      requests.get('http://example.com', proxies=proxies)
      
      • 超时设置:
      requests.get('http://example.com', timeout=5)
      
      • SSL 验证:
      requests.get('https://example.com', verify='/path/to/cert.pem')
      

      响应处理

      • response.status_code – HTTP 状态码
      • response.headers – 响应头
      • response.content – 二进制响应体
      • response.text – 文本响应体
      • response.json() – JSON 解析

      json 模块用于 API 数据交互:

      序列化

      data = {'name': 'Alice', 'age': 30, 'skills': ['Python', 'SQL']}
      json_str = json.dumps(data, indent=2)  # 美化输出
      

      反序列化

      data = json.loads('{"name": "Alice", "age": 30}')
      

      文件操作

      # 写入文件
      with open('data.json', 'w') as f:
          json.dump(data, f)
      
      # 读取文件
      with open('data.json') as f:
          data = json.load(f)
      

      高级功能

      • 自定义编码器:
      class CustomEncoder(json.JSONEncoder):
          def default(self, obj):
              if isinstance(obj, datetime):
                  return obj.isoformat()
              return super().default(obj)
      
      json.dumps(obj, cls=CustomEncoder)
      
      • 解析参数:
      json.loads(json_str, object_hook=my_decoder)
      

      csv 模块用于报表生成:

      读取 CSV

      with open('data.csv') as f:
          reader = csv.reader(f)
          for row in reader:
              print(row)
      

      写入 CSV

      with open('output.csv', 'w', newline='') as f:
          writer = csv.writer(f)
          writer.writerow(['Name', 'Age'])
          writer.writerow(['Alice', 30])
      

      字典格式

      # 读取
      with open('data.csv') as f:
          reader = csv.DictReader(f)
          for row in reader:
              print(row['Name'], row['Age'])
      
      # 写入
      with open('output.csv', 'w') as f:
          fieldnames = ['Name', 'Age']
          writer = csv.DictWriter(f, fieldnames=fieldnames)
          writer.writeheader()
          writer.writerow({'Name': 'Alice', 'Age': 30})
      

      方言支持

      csv.register_dialect('mydialect', delimiter='|', quoting=csv.QUOTE_MINIMAL)
      with open('data.psv') as f:
          reader = csv.reader(f, dialect='mydialect')
      

      yaml 用于配置文件解析:

      基本用法

      import yaml
      
      # 解析 YAML
      with open('config.yaml') as f:
          config = yaml.safe_load(f)
      
      # 生成 YAML
      data = {'server': {'host': '127.0.0.1', 'port': 8000}}
      yaml_str = yaml.dump(data, default_flow_style=False)
      

      高级特性

      • 锚点和别名:
      defaults: &defaults
        adapter: postgres
        host: localhost
      
      development:
        <<: *defaults
        database: dev
      
      • 自定义标签
      • 多文档流

      安全考虑

      • 始终优先使用 yaml.safe_load() 而非 yaml.load()
      • 避免加载不受信任的 YAML 文件
      • 复杂对象需要自定义表示器/构造器

      与其他格式对比

      • 比 JSON 更易读
      • 支持注释
      • 比 XML 更简洁
      • 适合配置文件和复杂数据结构

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • Python使用Plotly制作交互式图表的操作指南
      • 一文教你如何使用python编写交互式.exe程序
      • 使用Python进行数据库交互的实践指南(从SQL查询到ORM操作)
      • Python与Java交互出现乱码的问题解决
      • Python与Java进行交互操作的方法与性能对比
      • 使用Python打造交互式图片管理器

      站内搜索