如何通过sys.argv获取准确URL?终端传递时字符转义异常
解决sys.argv获取含&的URL时被截断/编码异常的问题
问题场景
我用这段Python代码通过sys.argv获取传入的URL:
import sys url = sys.argv[1] print(url)
执行命令时输入了带&的签名URL:
python test.py https://s3.amazonaws.com/apm_prod_00f03632faded6cf0aafb3de4895e9eb/d_20230519_174025.heic%22&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
但终端运行后,无法拿到完整的URL,原本的&还被转成了%26,怎么解决?
解决方法
1. 用引号包裹整个URL
终端里的&是特殊字符,默认会被解析成「后台执行命令」的分隔符,直接输入会把URL拆成多个部分。把整个URL用单引号或双引号包起来,就能让shell把它当成单个参数传递:
# 用双引号包裹(注意如果URL里包含双引号解码字符%22,建议用单引号) python test.py "https://s3.amazonaws.com/apm_prod_00f03632faded6cf0aafb3de4895e9eb/d_20230519_174025.heic%22&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential" # 更稳妥的单引号包裹(避免URL里的双引号编码干扰) python test.py 'https://s3.amazonaws.com/apm_prod_00f03632faded6cf0aafb3de4895e9eb/d_20230519_174025.heic%22&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential'
2. 转义每个&符号
在每个&前面加反斜杠\,告诉shell这是普通字符,不是命令分隔符:
python test.py https://s3.amazonaws.com/apm_prod_00f03632faded6cf0aafb3de4895e9eb/d_20230519_174025.heic%22\&X-Amz-Algorithm=AWS4-HMAC-SHA256\&X-Amz-Credential
原因说明
shell会自动解析命令行里的特殊字符(比如&、空格、引号等),你输入的&被shell识别为后台执行标记,导致URL被拆成了多个独立命令,只有&之前的内容会作为第一个参数传给Python,后面的X-Amz-Algorithm=...会被当成新命令执行。用引号包裹或转义后,shell会把整个URL作为单个字符串传递给sys.argv[1],就能完整获取到原始URL。
内容的提问来源于stack exchange,提问作者Ben David
相关产品推荐
相关产品推荐

