我正在开发一个Python 3X程序,该程序至少需要一个命令行参数。
当前,我正在使用argparse库处理参数,该库通过显示帮助文本并杀死程序来处理不足的参数。从命令行运行程序时,这非常有用。
但是,如果用户单击.py或.pyc文件本身,则用户没有机会阅读帮助文本或输入参数-该程序几乎立即运行并完成。我想通过双击文件来查找程序何时运行,以便在这种情况下可以运行交互式UI。
换句话说,如果要在程序上单击,我想以交互方式输入参数,但是如果程序在命令行上运行,则要保持argparse的标准行为,即让用户指定所有参数立即例如python myprogram.py argument1
。
为此,我需要知道程序是从命令行运行还是通过双击文件运行。我知道python确实有类似的工具来检查模块是否已导入或作为脚本if __name__ == "__main__":
运行。
最小示例:
#test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("inputpath", help="path to plaintext input file")
args = parser.parse_args()
print(args.inputpath)
如果用户没有输入适当的参数,在命令行上运行可以为我们提供很好的错误处理:
user@MyPC:path/to/file$ python test.py
usage: test.py [-h] inputpathtest.py: error: the following arguments are
required: inputpath
但是,尝试双击该文件只会运行它并立即退出。没有时间输入参数或阅读错误消息。
可能的解决方案:
执行此操作的一种方法是可选的“交互式”参数,如果不存在该参数,则会手动提示用户。如果脚本是通过双击运行的,则默认设置为“交互性打开”将允许用户输入输入。但是,它仍然允许命令行用户使用交互功能选项来关闭此行为。不利之处在于,用户必须输入选项才能获得“正常”行为(即,关闭互动功能)。
我要调查的另一种方法是,当通过双击运行时,它显示为sys.argv = ["pathtofile", '', '', '', '', '', '', '', '']
。这应该是一种独特的方式来判断脚本是通过双击还是从终端运行。
这至少在Windows 10上对我有效:
if sys.argv[1:]==['']*8:
print("Running from a doubleclick")
else:
print("running from a terminal")
因此,只需插入命令行和交互式UI,而不是打印语句和瞧。
如果有人有一个更优雅的答案,我会保持开放状态。
答案 0 :(得分:1)
您可以使用sys.argv
的长度在命令行提供的参数之后获取任意数量的参数:
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循环替换为:
while True:
arg = input("Enter another argument")
if arg == '':
break
else:
arguments.append(arg)