【问题标题】:TypeError: can only concatenate str (not "NoneType") to str python boto3TypeError:只能将str(不是“NoneType”)连接到str python boto3
【发布时间】:2021-02-22 18:45:09
【问题描述】:

我已经写下 python boto3 脚本来读取 json 文件。在阅读 json 文件时,我使用 argparse 添加了一些参数。在调用脚本时,它抛出了以下错误:

这里是代码

#!/usr/bin/env python
import json
import sys
import os
import re
import boto3
import argparse

def init():
    global pa
    parser = argparse.ArgumentParser(description='Additional Params.')
    parser.add_argument('--Tier', nargs='?', dest='Tier', required=False, help='Tier')
    parser.add_argument('--BusinessUnit', nargs='?', dest='BusinessUnit', required=False, help='BusinessUnit')
    parser.add_argument('--LineOfBusiness', nargs='?', dest='LineOfBusiness', required=False, help='LineOfBusiness')
    parser.add_argument('--branchName', nargs='?', dest='branchName', required=False, help='branchName')
    parser.add_argument('--ProjectName', nargs='?', dest='ProjectName', required=False, help='ProjectName')
    parser.add_argument('--ContextPath', nargs='?', dest='ContextPath', required=False, help='ContextPath')
    pa = parser.parse_args()


def update_secret():
    init()
    with open('application-' + pa.Tier + '.properties.json') as f:
        baselist = json.load(f)

    client = boto3.client('secretsmanager', region_name='us-east-1')
    config_secret = get_secret()

    for secrets in baselist:
        response = client.update_secret(SecretId=pa.BusinessUnit + "/" + pa.LineOfBusiness + "/" + pa.ProjectName + "/" + pa.branchName + pa.ContextPath + "/" + 'application_' + pa.Tier, SecretString=baselist[secrets][1:])
    print(response)

if __name__ == '__main__':
    update_secret()
[Container] 2020/11/09 20:13:46 Running command python updateSecrets.py --Tier $Tier --BusinessUnit $BusinessUnit --LineOfBusiness $LineOfBusiness --ProjectName ProjectName --ContextPath $ContextPath --branchName $branchName
Traceback (most recent call last):
  File "updateSecrets.py", line 81, in <module>
    update_secret()
  File "updateSecrets.py", line 30, in update_secret
    with open('application-' + pa.Tier + '.properties.json') as f:
TypeError: can only concatenate str (not "NoneType") to str

【问题讨论】:

  • 在您的 argparse 设置中,您写了 parser.add_argument('--Tier', nargs='?', dest='Tier', required=False, help='Tier')。使用 requirednargs 值,您可以显式将此参数设为可选,因此它可能不存在。用您自己的话来说,如果用户在命令行上提供--Tier 条目,您希望pa.Tier 等于什么?

标签: python json python-3.x boto3 aws-secrets-manager


【解决方案1】:

在传递命令行参数时,不要使用 '$' 符号作为值。 $ 不是必需的。以下是我编写的用于测试的最少代码。

#!/usr/bin/env python
import argparse

def init():
    global pa
    parser = argparse.ArgumentParser(description='Additional Params.')
    parser.add_argument('--Tier', nargs='?', dest='Tier', required=False, help='Tier')
    pa = parser.parse_args()


def update_secret():
    init()
    print('application-' + pa.Tier + '.properties.json')

if __name__ == '__main__':
    update_secret()

使用下面的命令行参数运行上面的程序。

python3 test.py --Tier abc

它在输出下方打印

application-abc.properties.json

【讨论】:

    【解决方案2】:

    您正在尝试将字符串与具有 None 值的变量连接

    with open('application-' + pa.Tier + '.properties.json') as f:
    # pa.Tier returns None here
    

    【讨论】:

    • 这没有回答问题,这从错误消息中显而易见。更新您的答案以显示如何修复它
    • 你应该在这里检查逻辑,pa.Tier 没有任何值
    • pa.Tier,我在运行时给出了一个参数值。你能解释一下这个 pa.Tier 是如何返回值的吗
    • 你能在错误行之前和调用 init() 函数之后打印(pa.Tier) 来检查它打印了什么
    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2021-12-28
    • 2020-09-18
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多