How to tell if a script is run by double-clicking .py file?
我正在开发一个python 3x程序,它至少需要一个命令行参数。
目前,我正在使用argparse库处理参数,它通过显示帮助文本和终止程序来处理不足的参数。当程序从命令行运行时,这非常有用。
但是,如果用户单击.py或.pyc文件本身,用户就没有机会读取帮助文本或输入参数-程序几乎立即运行并完成。我想通过双击一个文件来了解我的程序何时运行,这样我就可以在这种情况下运行一个交互式用户界面。
换言之,如果单击程序,我希望以交互方式输入参数,但如果程序在命令行上运行,则保持argparse的标准行为,即让用户一次性指定所有参数,例如
为了做到这一点,我需要知道程序是从命令行运行的还是通过双击一个文件运行的。我知道python确实有类似这样的功能,用于检查模块是作为脚本
最小示例:
1 2 3 4 5 6 | #test.py import argparse parser = argparse.ArgumentParser() parser.add_argument("inputpath", help="path to plaintext input file") args = parser.parse_args() print(args.inputpath) |
如果用户没有输入适当的参数,那么在命令行上运行可以很好地处理错误:
1 2 3 | user@MyPC:path/to/file$ python test.py usage: test.py [-h] inputpathtest.py: error: the following arguments are required: inputpath |
但是,尝试双击文件只会运行它并立即退出。没有时间输入参数或读取错误消息。
可能的解决方案:
这样做的一种方法是一个可选的"交互式"参数,如果不存在,它将手动提示用户。如果脚本是由DoubleClick运行的,则默认为Interactivity on将允许用户输入输入。但是,它仍然允许命令行用户使用交互选项来关闭此行为。缺点是,用户必须输入一个选项才能获得"正常"行为(即交互功能关闭)。
我正在调查的另一种方法是,当由DoubleClick运行时,它似乎是
在Windows10上,这至少对我有效:
1 2 3 4 | if sys.argv[1:]==['']*8: print("Running from a doubleclick") else: print("running from a terminal") |
因此,只需插入命令行和交互式uis,而不是打印语句和voila。
我把这个打开,以防有人有更优雅的回答。
您可以使用
1 2 3 4 5 | import sys desired_args = 4 # number of arguments you want arguments = sys.argv[1:] . # [1:] because the first one is your script for i in range(desired_args-len(arguments)): arguments.append(input("Enter another argument:")) |
或者,如果要让用户输入参数直到输入一个空行,请将for循环替换为:
1 2 3 4 5 6 | while True: arg = input("Enter another argument") if arg == '': break else: arguments.append(arg) |