Python “我可以”;打印(args.username),但我可以';是否使用args.username作为搜索值?

Python “我可以”;打印(args.username),但我可以';是否使用args.username作为搜索值?,python,argparse,Python,Argparse,我一直在试着调试我的程序。我通过argparse接受用户名参数,并希望使用args.username值搜索passwd文件。我收到以下错误:名称错误:未定义名称“args”。我可以打印(args.username),但不能在搜索中使用args.username import argparse # My argparse section def main(): # initialize the parser parser = argparse.ArgumentParser(de

我一直在试着调试我的程序。我通过argparse接受用户名参数,并希望使用args.username值搜索passwd文件。我收到以下错误:名称错误:未定义名称“args”。我可以打印(args.username),但不能在搜索中使用args.username

import argparse


# My argparse section
def main():
    # initialize the parser
    parser = argparse.ArgumentParser(description="my argparse script")

    # add the parameters positional/optional
    parser.add_argument('-u', '--username', nargs='+', help="Enter user name to search passwd file with", type=str)

    # parse the arguments
    args = parser.parse_args()
    # This print statement works fine
    print(args.username)
    print(args)


# My search the passwd file section
# The statement below, user=args.username is causing the error
user = args.username
with open("passwd") as file:
    for line in file:
        if line.split(":")[0] == user:
            print("User found      : " + line.split(":")[0])
        else:
            print("User not found  : " + line.split(":")[0])

if __name__ == '__main__':
    main()

args
main()
的范围内。而且,
main()
在您的搜索代码之后运行,因为您的搜索代码在任何函数之外。由于您的搜索超出了
main
的范围,因此无法访问
args
。您可以取消缩进搜索,使其在范围内,允许您使用
args
。这将产生在
main()
末尾而不是之前运行搜索的效果,因此不仅将定义
args
,而且还将在范围内:

import argparse


# My argparse section
def main():
    # initialize the parser
    parser = argparse.ArgumentParser(description="my argparse script")

    # add the parameters positional/optional
    parser.add_argument('-u', '--username', nargs='+', help="Enter user name to search passwd file with", type=str)

    # parse the arguments
    args = parser.parse_args()
    # This print statement works fine
    print(args.username)
    print(args)


    # My search the passwd file section
    # The statement below, user=args.username is causing the error
    user = args.username
    with open("passwd") as file:
        for line in file:
            if line.split(":")[0] == user:
                print("User found      : " + line.split(":")[0])
            else:
                print("User not found  : " + line.split(":")[0])

if __name__ == '__main__':
    main()

您提到可以在
main()
中执行
print(args.username)
,这似乎只有在删除搜索代码时才可能,因为搜索代码会在
main()
之前出错,甚至在您显示的代码中运行。因此,我认为您的示例不是打印工作的代码。

args
仅存在于
main()
方法中。另外,在您有
user=args.username
行的地方,您甚至还没有运行
main()
方法。@RocketHazmat:令人困惑的是,他们不应该在
main
中看到
打印
“工作正常”,因为在调用它之前,他们会在异常情况下死亡。所以这不是一个能证明所声称的行为的例子。@ShadowRanger哇,我甚至没注意到。我只是注意到代码超出了方法的范围,并假设这就是问题所在,但没有充分考虑它。谢谢大家的评论。我忘了注意user=“David”工作正常,但user=args.username是导致错误的原因。从你所有的评论和建议中,我能够克服这个错误。谢谢关于这个话题的最后一个问题。我不再得到错误,但是当我将参数-u=root传递给args.username并将其与passwd文件进行比较时,我没有得到匹配。我打开了passwd文件,有一个名为root的用户。如果我硬编码user=“root”而不是通过args.username传递值,效果很好。@zeusbella通常建议您就任何单独的问题提出新问题。不过,我会先尝试一些简单的调试;
args.username
是否具有您期望的准确长度?比如,你确定没有空格之类的吗?当你打印出来的时候,你看到了你期望的价值?