关于python:如何通过双击.py文件来判断脚本是否运行?

How to tell if a script is run by double-clicking .py file?

我正在开发一个python 3x程序,它至少需要一个命令行参数。

目前,我正在使用argparse库处理参数,它通过显示帮助文本和终止程序来处理不足的参数。当程序从命令行运行时,这非常有用。

但是,如果用户单击.py或.pyc文件本身,用户就没有机会读取帮助文本或输入参数-程序几乎立即运行并完成。我想通过双击一个文件来了解我的程序何时运行,这样我就可以在这种情况下运行一个交互式用户界面。

换言之,如果单击程序,我希望以交互方式输入参数,但如果程序在命令行上运行,则保持argparse的标准行为,即让用户一次性指定所有参数,例如python myprogram.py argument1

为了做到这一点,我需要知道程序是从命令行运行的还是通过双击一个文件运行的。我知道python确实有类似这样的功能,用于检查模块是作为脚本if __name__ =="__main__":导入还是运行。

最小示例:

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运行时,它似乎是sys.argv = ["pathtofile", '', '', '', '', '', '', '', '']。这应该是一种独特的方式来判断脚本是由DoubleClick运行还是从终端运行。

在Windows10上,这至少对我有效:

1
2
3
4
if sys.argv[1:]==['']*8:
    print("Running from a doubleclick")
else:
    print("running from a terminal")

因此,只需插入命令行和交互式uis,而不是打印语句和voila。

我把这个打开,以防有人有更优雅的回答。


您可以使用sys.argv的长度,在命令行提供的参数之后,获取所需的参数:

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)