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

为何Shell脚本传参后ArgumentParser的HIVE_参数仍为None?

问题描述

Shell脚本调用Python脚本并传递从配置文件加载的参数,Shell中测试变量输出正常,但所有HIVE_开头的参数在Python的ArgumentParser中都被标记为None。

Shell脚本内容

set -e

if [ ! -z "$1" ]
then
config_file="$1"
else
config_file="./env.sh"
fi

${venv_path} ${mpw_path}/src/main_sample.py \
--MPW_BASE "${mpw_base}" --MPW_PATH "${mpw_path}" \
--FUNC "${trueup}" --TRUEUP_FILE "${trueup_file}"  \
--TRUEUP_FILE_MANUAL "${trueup_file_manual}" --LATEST_TRUEUP_STAMP "${latest_trueup_stamp}" \
--SQL_driver "${SQL_driver}" --SQL_server "$SQL_server" \
--SQL_port "${SQL_port}" --SQL_db "${SQL_db}" \
--LANDING_ZONE "${landing_zone}" --TIME_STAMP "${time_stamp}" \\ 
--HIVE_driver "${HIVE_driver}" --HIVE_host "${HIVE_host}" \
--HIVE_ZKNamespace "${HIVE_zknamespace}" --HIVE_ServiceDiscoveryMode "${HIVE_servicediscoverymode}" \
--HIVE_AuthMech "${HIVE_authMech}" --HIVE_KrbServiceName "${HIVE_krbservicename}" \\ 
--HIVE_KrbHostFQDN "${HIVE_krbhostfqdn}" --HIVE_SSP_tezqueue "${HIVE_ssp_tezqueue}"

配置文件内容

HIVE_driver=""
HIVE_host=""
HIVE_zknamespace=""
HIVE_servicediscoverymode=""
HIVE_authMech=""
HIVE_krbserviceame=""
HIVE_krbhostfqdn=""
HIVE_ssp_tezqueue=""

注:配置变量值为空是有意为之。

Python脚本关键部分

parser = argparse.ArgumentParser(description='MPW Arg Parser')
parser.add_argument('--MPW_BASE', help='base directory of project') 
parser.add_argument('--MPW_PATH', help='directory of the repo') 
parser.add_argument('--FUNC', help='function to done')
parser.add_argument('--TRUEUP_FILE', help='mapping to be passed in writecustomertrueup') 
parser.add_argument('--TRUEUP_FILE_MANUAL',  help='trueup exercise of previous week')
parser.add_argument('--LATEST_TRUEUP_STAMP', help='trueup stamp') 
parser.add_argument('--SQL_driver', help='SQL Driver') 
parser.add_argument('--SQL_server', help='SQL Server') 
parser.add_argument('--SQL_port', help='SQL Port') 
parser.add_argument('--SQL_db', help='DATABASE to connect')
parser.add_argument('--LANDING_ZONE', help='Landing zone of MPW')
parser.add_argument('--TIME_STAMP', help="time stamp") 
parser.add_argument('--HIVE_driver', help='EDL Driver') 
parser.add_argument('--HIVE_host', help='EDL Host') 
parser.add_argument('--HIVE_ZKNamespace', help='EDL ZKNamespace')
parser.add_argument('--HIVE_ServiceDiscoveryMode', help='EDL Service Discovery Mode') 
parser.add_argument('--HIVE_AuthMech', help='EDL Auth Mech') 
parser.add_argument('--HIVE_KrbServiceName', help = 'KrbServiceName') 
parser.add_argument('--HIVE_KrbHostFQDN', help = 'For EDL connection') 
parser.add_argument('--HIVE_SSP_tezqueue', help = 'For EDL connection') 

args, unknown = parser.parse_known_args()    

if args.MPW_BASE is None or args.MPW_PATH is None or args.FUNC is None \
or args.TRUEUP_FILE is None or args.TRUEUP_FILE_MANUAL is None \
or args.LATEST_TRUEUP_STAMP is None or args.SQL_driver is None \
or args.SQL_server is None or args.SQL_port is None or args.SQL_db \
is None or args.LANDING_ZONE is None or args.TIME_STAMP is None \
or args.HIVE_driver is None or args.HIVE_host is None or args.HIVE_ZKNamespace \
is None or args.HIVE_ServiceDiscoveryMode is None or args.HIVE_AuthMech \
is None or args.HIVE_KrbServiceName is None or args.HIVE_KrbHostFQDN is None \
or args.HIVE_SSP_tezqueue is None:

  logging.error(str(args))
  logging.error(str(unknown)) 

错误日志

args输出日志

22/11/21 13:16:02 ERROR <module> Namespace(FUNC='TRUEUP', HIVE_AuthMech=None, HIVE_KrbHostFQDN=None, HIVE_KrbServiceName=None, HIVE_SSP_tezqueue=None, HIVE_ServiceDiscoveryMode=None, HIVE_ZKNamespace=None, HIVE_driver=None, HIVE_host=None

unknown输出日志

22/11/21 13:16:02 ERROR <module> [' ']

用户尝试修改配置文件和Shell脚本中的变量名,但HIVE_开头的参数仍返回None,期望能正确读取这些参数。


解决方案

1. 修复Shell脚本中的换行转义问题

Shell脚本中--TIME_STAMP "${time_stamp}"后面使用了\\ (双反斜杠加空格),这会导致后续--HIVE_*参数被错误解析。正确的换行转义应为单个反斜杠\,且\后直接换行,不要加多余空格:

${venv_path} ${mpw_path}/src/main_sample.py \
--MPW_BASE "${mpw_base}" --MPW_PATH "${mpw_path}" \
--FUNC "${trueup}" --TRUEUP_FILE "${trueup_file}"  \
--TRUEUP_FILE_MANUAL "${trueup_file_manual}" --LATEST_TRUEUP_STAMP "${latest_trueup_stamp}" \
--SQL_driver "${SQL_driver}" --SQL_server "$SQL_server" \
--SQL_port "${SQL_port}" --SQL_db "${SQL_db}" \
--LANDING_ZONE "${landing_zone}" --TIME_STAMP "${time_stamp}" \
--HIVE_driver "${HIVE_driver}" --HIVE_host "${HIVE_host}" \
--HIVE_ZKNamespace "${HIVE_zknamespace}" --HIVE_ServiceDiscoveryMode "${HIVE_servicediscoverymode}" \
--HIVE_AuthMech "${HIVE_authMech}" --HIVE_KrbServiceName "${HIVE_krbservicename}" \
--HIVE_KrbHostFQDN "${HIVE_krbhostfqdn}" --HIVE_SSP_tezqueue "${HIVE_ssp_tezqueue}"

2. 修正配置文件中的变量拼写错误

配置文件中HIVE_krbserviceame少了一个N,需改为HIVE_krbservicename,与Shell脚本中引用的变量名保持一致:

# 配置文件修正后
HIVE_krbservicename=""

3. 验证变量加载是否正常

在Shell脚本调用Python前,添加调试语句打印所有HIVE_开头的变量,确认变量已从配置文件正确加载:

echo "HIVE_driver: ${HIVE_driver}"
echo "HIVE_host: ${HIVE_host}"
echo "HIVE_zknamespace: ${HIVE_zknamespace}"
# 其他HIVE_变量同理打印

4. 调整Python参数解析逻辑(可选)

若需要允许空参数被正确识别而非设为None,可给add_argument添加default=""参数:

parser.add_argument('--HIVE_driver', help='EDL Driver', default="") 
parser.add_argument('--HIVE_host', help='EDL Host', default="") 
# 其余HIVE_参数同理添加default=""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:50:50