如何判断脚本是否通过双击.py文件运行?

时间:2018-06-29 17:09:22

标签: python python-3.x

我正在开发一个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,而不是打印语句和瞧。

如果有人有一个更优雅的答案,我会保持开放状态。

1 个答案:

答案 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)