使用argparser向入口点Python脚本传递参数

8

我希望能够将用户从命令行输入的参数传递给Python脚本的入口点。目前为止,我尝试使用argparse将参数从命令行传递给test.py脚本。但是当我尝试传递参数时,它们未被识别,并收到以下错误提示:

load_entry_point('thesaurus==0.1', 'console_scripts', 'thesaurus')()
TypeError: find_synonym()缺少一个必需的位置参数:'argv'

我查看了这里的其他示例,但都无法使任何解决方案起作用。

def main(argv):
    if argv is None:
        argv = sys.argv

    parser = argparse.ArgumentParser(description='Enter string')
    parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
    args = parser.parse_args(argv[1:])
    print(args)

if __name__ == "__main__":
    sys.exit(main(sys.argv))

我的setup.py脚本入口点如下所示

setup(entry_points={'console_scripts': ['test=test_folder.main:main']})

我期望发生的情况类似于运行 python main.py main foo。当将 "hello" 传递给函数时,将成功打印出来。

1
如果您正在使用argparse,为什么还要使用sys.argv? - Old Winterton
2
@OldWinterton,像这样使用argv在测试main时会给予一些灵活性。当以传统方式调用此脚本时,它可以正常运行。 - hpaulj
2个回答

7

如果从函数中删除参数,现在它可以工作了。

 def main():          
        parser = argparse.ArgumentParser(description='Enter string')
        parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
        args = parser.parse_args()
        print(args.string)

if __name__ == "__main__":
    main()

我认为第一个例子中使用的sys.arv可能有效,因为我的实际问题是当我使用

pip install git+ URL

从GitHub重新下载此脚本时,脚本没有更新,所以错误仍然存在,这需要删除与GitHub存储库相关的所有文件,并使用相同的pip命令重新安装它。


我在博客文章中提供了一个完整的工作示例,基于这个答案,供任何感兴趣的人参考。https://hughesadam87.medium.com/dead-simple-pytest-and-argparse-d1dbb6affbc3 - Adam Hughes

2
为了兼顾两方面,main()应该接受argv参数(这样测试会更容易,就像你观察到的)。然而,你需要一个默认值来将其用作入口点,以便可以不使用参数调用它。代码如下所示:

def main(argv=sys.argv):
    parser = argparse.ArgumentParser(description='Enter string')
    parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
    args = parser.parse_args(argv[1:])
    print(args)


现在它可以进行测试,您仍然可以将其用作入口点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接