【发布时间】:2018-12-18 23:29:05
【问题描述】:
我正在使用某人的 GitHub 代码,该代码旨在从命令行调用,如下所示:
> python this_script.py -u <username> -p <password> -i <id_num> ...
这会在this_script.py 中以这种方式解析输入后生成一个输出文本文件:
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='get data', add_help=False, usage='this_script.py -u username -p password [options]')
parser.add_argument('-u', metavar='<STR>', type=str, help='username')
parser.add_argument('-p', metavar='<STR>', type=str, help='password')
parser.add_argument('-i', metavar='<STR>', nargs='+', type=str, help='List of IDs')
...
我想在我自己的代码集中使用其中的许多文本文件,因此将其从命令行脚本转换为可调用函数会更方便,语法如下:
def this_script(password, username, *args):
...
有没有一种简单的方法可以做到这一点,而不必过多地处理当前定义的 __main__ 块的内部工作?
【问题讨论】:
-
我在您的示例中没有看到任何名为
main的函数?这完全取决于代码......通常你可以将所有内容放入一个函数中并完成,但如果代码依赖于 globals&stuff,则情况并非如此。以及如何重构完全取决于具体的代码。你所说的问题太宽泛了。你应该提供一个具体的例子,你的尝试以及它有什么问题。 -
快速而肮脏的解决方案是分配给
sys.argv,然后不加改变地运行该代码:sys.argv = ['blah', '-u', username, '-p', password] + args -
@Bakuriu 我以为我在这里展示了 main 代码?据我了解,就是从命令行运行脚本时调用的函数,对吧?
-
按照惯例,在
__main__块中通常调用一个名为main的函数。您的措辞可能具有误导性,因此对其进行了编辑以避免混淆。如果在解析参数之后,脚本然后调用带有解析参数的工作函数,那么您可能可以直接调用该工作函数 - 这就是 Bakuriu 的意思。无论如何,脚本的作者将参数解析放在了错误的位置。 -
@wim 不幸的是,在这种情况下没有任何工作函数。它通向
args = parser.parse_args(),然后在整个函数中使用args.u、args.p等。那么我是否有必要设计自己的函数来获取所有这些输入?我想尽可能多地保留代码。
标签: python function command-line