为何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
相关产品推荐
相关产品推荐

