簡體   English   中英

如何判斷腳本是否通過雙擊.py文件運行?

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

我正在研究需要至少一個命令行參數的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

但是,嘗試雙擊該文件只會運行它並立即退出。 沒有時間輸入參數或閱讀錯誤消息。


可能的解決方案:

一種實現方法是可選的“交互”參數,如果不存在該參數,則會手動提示用戶。 如果腳本是通過雙擊運行的,則默認設置為“交互性打開”將允許用戶輸入輸入。 但是,它仍然允許命令行用戶使用交互功能選項來關閉此行為。 不利之處在於,用戶必須輸入選項才能獲得“正常”行為(即,關閉了交互功能)。

我正在調查的另一種方式是,當通過doubleclick運行時,它似乎是sys.argv = ["pathtofile", '', '', '', '', '', '', '', ''] 這應該是一種獨特的方式來判斷腳本是通過雙擊還是從終端運行。

這至少對我在Windows 10上有效:

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

因此,只需插入您的命令行和交互式UI,而不是打印語句和瞧。

我會保持開放狀態,以防任何人有一個更優雅的答案。

您可以使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM