跳转至

Python 入门 / Python 第三方库

第三方库由 Python 社区或其他组织提供,不随 Python 标准库一起安装。大多数公开包可以在 PyPI / Python Package Index 中找到。

本文介绍 DataFlux Func 脚本中常用的 requestsarrowxmltodict。当前 DataFlux Func 环境已预装这些依赖;其他环境需要单独安装。

1. 安装与确认依赖

在普通 Python 环境中,推荐通过当前解释器调用 pip,避免把包安装到另一个 Python 环境:

Bash
1
2
3
4
5
6
7
8
# 安装最新兼容版本
python -m pip install requests

# 安装指定版本
python -m pip install requests==2.33.0

# 查看已安装版本
python -m pip show requests

在项目中应根据兼容性要求固定依赖版本,并把版本约束记录在依赖文件中。不要仅凭包名相似就安装;先确认 PyPI 项目主页、维护者和官方文档,防止引入错误或恶意包。

DataFlux Func 中的预装包可在「管理 / PIP 工具」中查看。需要增加其他包时,请通过该工具安装,不要在业务脚本中执行 pip。详细步骤请参考 脚本开发 / 安装第三方包

2. HTTP 请求(requests

requests 用于发送 HTTP 请求,完整接口请参考 requests 官方文档

2.1 发送 GET 请求

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import requests

params = {
    'user_id': 'u-001',
}
headers = {
    'Accept': 'application/json',
}

response = requests.get(
    'https://httpbin.org/get',
    params=params,
    headers=headers,
    timeout=10,
)
response.raise_for_status()

data = response.json()
print('状态码:', response.status_code)
print('请求参数:', data['args'])

成功时,response.status_code200data['args'] 中包含请求参数。服务端返回的请求头、来源地址等内容可能随运行环境变化。

  • params 将字典编码到 URL 查询参数中。
  • headers 设置请求头。
  • timeout 限制等待响应的时间。
  • raise_for_status()4xx5xx 响应时抛出异常。
  • response.text 返回文本,response.content 返回字节,response.json() 尝试解析 JSON。

2.2 发送 POST 请求

使用 json 参数发送 JSON 请求体:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import requests

payload = {
    'name'  : 'Tom',
    'active': True,
}

response = requests.post(
    'https://httpbin.org/post',
    json=payload,
    timeout=10,
)
response.raise_for_status()

data = response.json()
print(data['json']['name'])

输出:

Text Output
1
Tom

如果接口需要表单请求体,应改用 data=payload。不要同时传入 jsondata 来表达同一个请求体。

2.3 处理请求异常

网络请求可能因超时、DNS、连接失败、证书错误或异常状态码而失败。可以在业务边界捕获 RequestException

Python
1
2
3
4
5
6
7
8
9
import requests

try:
    response = requests.get('https://httpbin.org/status/503', timeout=10)
    response.raise_for_status()
except requests.RequestException as e:
    print(f'请求失败:{e}')
else:
    print(response.text)

捕获异常后应根据业务需要重试、返回明确的失败结果或记录上下文,不要直接忽略。

生产代码应始终设置合理的超时时间,并保持 HTTPS 证书验证开启。不要为绕过证书问题长期使用 verify=False

访问令牌、密码等敏感信息通常应放在请求头中,并从安全配置读取,不应硬编码到脚本、URL 或日志中。

3. 时间处理(arrow

arrow 提供较简洁的日期时间解析、时区转换、格式化和运算接口,完整用法请参考 arrow 官方文档

3.1 获取当前时间

Python
1
2
3
4
5
6
7
8
import arrow

utc_now      = arrow.utcnow()
shanghai_now = arrow.now('Asia/Shanghai')

print(type(utc_now.timestamp))
print(shanghai_now.format('YYYY-MM-DD HH:mm:ss'))
print(shanghai_now.isoformat())

第一行输出 int 类型;后两行的具体时间取决于运行时刻。

3.2 解析和转换时间

Python
1
2
3
4
5
6
7
import arrow

utc_time      = arrow.get('2026-08-11T02:30:00Z')
shanghai_time = utc_time.to('Asia/Shanghai')

print(shanghai_time.format('YYYY-MM-DD HH:mm:ss'))
print(shanghai_time.isoformat())

输出:

Text Output
1
2
2026-08-11 10:30:00
2026-08-11T10:30:00+08:00

3.3 时间运算

Python
1
2
3
4
5
6
7
import arrow

current = arrow.get('2026-08-11T10:30:00+08:00')

print(current.shift(days=-1).format('YYYY-MM-DD HH:mm:ss'))
print(current.shift(hours=2).format('YYYY-MM-DD HH:mm:ss'))
print(current.floor('day').format('YYYY-MM-DD HH:mm:ss'))

输出:

Text Output
1
2
3
2026-08-10 10:30:00
2026-08-11 12:30:00
2026-08-11 00:00:00

解析不带时区的时间文本时,应根据数据来源明确指定时区,不要默认把它当作 UTC 或北京时间。

4. XML 解析(xmltodict

xmltodict 将 XML 元素转换为嵌套的 Python 字典和列表。它不会直接生成 JSON;需要 JSON 文本时,再使用标准库 json 序列化。

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import json

import xmltodict

xml_text = '''
<user>
    <name>张三</name>
    <age>25</age>
    <role>程序员</role>
    <role>项目经理</role>
</user>
'''

data = xmltodict.parse(xml_text)

print(data['user']['name'])
print(data['user']['role'])
print(json.dumps(data, ensure_ascii=False, indent=2))

前两行输出:

Text Output
1
2
张三
['程序员', '项目经理']

XML 中的文本默认解析为字符串,因此 <age>25</age> 得到 "25",不会自动变成整数。重复元素通常解析为列表,但只有一个同名元素时可能解析为单个值;消费结构不固定的 XML 时需要处理这种差异。

不要使用不可信 XML 直接处理高风险业务。复杂 XML、安全边界和实体相关问题应使用适合该场景的解析方案并设置输入限制

5. 使用第三方库的注意事项

  • 阅读与实际安装版本对应的文档;新版示例不一定适用于旧版本。
  • 为网络、文件和数据解析设置合理的输入大小、超时和异常处理。
  • 不要创建 requests.pyarrow.pyxmltodict.py 等同名脚本,否则会遮蔽真正的第三方库。
  • 升级前检查依赖关系和兼容性,并在测试环境验证;不要仅为追求“最新版”直接升级生产依赖。
  • 删除不再使用的依赖,减少安全风险、镜像体积和维护成本。

6. 下一步

掌握库的基本用法后,可以阅读 Python 入门 / 代码片段参考,了解如何组合这些知识解决常见脚本问题。