在Python单击库中使用布尔标志(命令行参数)
我正在尝试为我的Python程序创建一个详细标志。 目前,我正在这样做:在Python单击库中使用布尔标志(命令行参数),python,command-line-arguments,python-click,Python,Command Line Arguments,Python Click,我正在尝试为我的Python程序创建一个详细标志。 目前,我正在这样做: import click #global variable verboseFlag = False #parse arguments @click.command() @click.option('--verbose', '-v', is_flag=True, help="Print more output.") def log(verbose): global verboseFlag verboseF
import click
#global variable
verboseFlag = False
#parse arguments
@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def log(verbose):
global verboseFlag
verboseFlag = True
def main():
log()
if verboseFlag:
print("Verbose on!")
if __name__ == "__main__":
main()
即使我设置了“-v”参数,它也不会打印“Verbose on!”。我的想法是log函数需要一个参数,但是我应该给它什么呢?另外,有没有一种方法可以在没有全局变量的情况下检查verbose标志是否处于打开状态?因此click不仅仅是一个命令行解析器。它还分派和处理命令。因此,在您的示例中,
log()
函数永远不会返回到main()
。该框架的目的是,修饰后的函数,即:log()
,将完成所需的工作
代码:
测试代码:
结果:
上面的答案很有帮助,但这就是我最终使用的答案。我想我应该和大家分享一下,因为很多人都在关注这个问题:
@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def main(verbose):
if verbose:
# do something
if __name__ == "__main__":
# pylint: disable=no-value-for-parameter
main()
如何将实际的命令行参数/标志传递给main?现在,类似“python3tester.py--verbose”的东西将提供与“python3tester.py”相同的输出
if __name__ == "__main__":
commands = (
'--verbose',
'-v',
'',
'--help',
)
import sys, time
time.sleep(1)
print('Click Version: {}'.format(click.__version__))
print('Python Version: {}'.format(sys.version))
for cmd in commands:
try:
time.sleep(0.1)
print('-----------')
print('> ' + cmd)
time.sleep(0.1)
main(cmd.split())
except BaseException as exc:
if str(exc) != '0' and \
not isinstance(exc, (click.ClickException, SystemExit)):
raise
Click Version: 6.7
Python Version: 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
-----------
> --verbose
Verbose on!
-----------
> -v
Verbose on!
-----------
>
Verbose off!
-----------
> --help
Usage: test.py [OPTIONS]
Options:
-v, --verbose Print more output.
--help Show this message and exit.
@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def main(verbose):
if verbose:
# do something
if __name__ == "__main__":
# pylint: disable=no-value-for-parameter
main()