You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyCharm与终端带参运行Python脚本时的API认证失败问题

解决终端传参时密码含$符号导致认证失败的问题

问题根源

你观察到的密码中$开头的部分丢失,本质是Bash(或其他类Unix shell)会将$开头的字符串视为环境变量名,尝试去替换成对应的变量值。如果这个变量不存在(比如$qTyqf没被定义过),shell就会把它替换成空字符串,导致最终传递给Python脚本的密码缺失了这部分内容,自然会触发API的"invalid login data"错误。

而PyCharm的运行/调试配置里传参正常,是因为PyCharm在处理参数时不会像终端shell那样解析特殊符号,直接把引号里的内容完整传递给了脚本。

解决办法

这里有几种可靠的解决方式,你可以根据场景选择:

1. 用单引号包裹密码参数

shell不会解析单引号内部的任何特殊字符(包括$、?、.这些),所以把密码放在单引号里就能完整传递:

python -m scriptname "abcde" 'abcde$qTyqf§abcde'

2. 对$符号进行转义

在每个$前面添加反斜杠\,告诉shell这是一个普通字符,不要当作变量解析:

python -m scriptname "abcde" "abcde\$qTyqf§abcde"

3. 从标准输入读取密码(更安全的方案)

命令行参数会被记录在shell的历史记录里,存在安全风险。更稳妥的方式是让脚本通过标准输入读取密码,比如使用Python的getpass模块,避免密码暴露在命令行中,同时也能避开shell解析的问题:
修改你的代码:

import requests
import argparse
import json
import getpass  # 导入getpass模块

URL = "some url"
parser = argparse.ArgumentParser()
parser.add_argument("username", help="Username")
args = parser.parse_args()

# 用getpass读取密码,避免命令行参数的问题
password = getpass.getpass("Please enter your password: ")

def get_token(username, password):
    url = URL + "/auth"
    headers = {'Content-type': 'application/json'}
    params = {
        "username": username,
        "password": password
    }
    r = requests.post(url, json=params, headers=headers)
    return json.loads(r.content.decode('utf-8'))['data']['token']

token = get_token(args.username, password)
print(token)

运行脚本时只需要输入用户名,然后在提示后输入密码即可:

python -m scriptname abcde

内容的提问来源于stack exchange,提问作者maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:31:32