Определить запуск скрипта из командной строки или «двойного щелчка» в Windows - PullRequest
7 голосов
/ 18 февраля 2009

Можно ли определить, был ли скрипт Python запущен из командной строки или если пользователь "дважды щелкнул" по файлу .py в проводнике Windows?

Ответы [ 5 ]

8 голосов
/ 18 января 2013

При запуске из командной строки определена дополнительная переменная среды 'PROMPT'.

Этот сценарий будет останавливаться при нажатии из проводника и не приостанавливаться при запуске из командной строки:

import os

print 'Hello, world!'

if not 'PROMPT' in os.environ:
    raw_input()

Протестировано на Windows 7 с Python 2.7

3 голосов
/ 21 февраля 2009

Вот пример того, как получить идентификатор родительского процесса и имя текущего запущенного скрипта. В соответствии с предложением Tomalak это можно использовать для обнаружения запуска сценария из командной строки или двойным щелчком в проводнике.

import win32pdh
import os

def getPIDInfo():
    """ 
    Return a dictionary with keys the PID of all running processes.
    The values are dictionaries with the following key-value pairs:
        - name: <Name of the process PID>
        - parent_id: <PID of this process parent>
    """

    # get the names and occurences of all running process names
    items, instances = win32pdh.EnumObjectItems(None, None, 'Process', win32pdh.PERF_DETAIL_WIZARD)
    instance_dict = {}
    for instance in instances:
        instance_dict[instance] = instance_dict.get(instance, 0) + 1

    # define the info to obtain 
    counter_items =  ['ID Process', 'Creating Process ID']

    # output dict
    pid_dict = {}

    # loop over each program (multiple instances might be running)
    for instance, max_instances in instance_dict.items():
        for inum in xrange(max_instances):
            # define the counters for the query 
            hq = win32pdh.OpenQuery()
            hcs = {}
            for item in counter_items:
                path = win32pdh.MakeCounterPath((None,'Process',instance, None,inum,item))
                hcs[item] = win32pdh.AddCounter(hq,path)
            win32pdh.CollectQueryData(hq)

            # store the values in a temporary dict
            hc_dict = {}
            for item, hc in hcs.items():
                type,val=win32pdh.GetFormattedCounterValue(hc,win32pdh.PDH_FMT_LONG)
                hc_dict[item] = val
                win32pdh.RemoveCounter(hc)
            win32pdh.CloseQuery(hq)

            # obtain the pid and ppid of the current instance
            # and store it in the output dict
            pid, ppid = (hc_dict[item] for item in counter_items) 
            pid_dict[pid] = {'name': instance, 'parent_id': ppid}

    return pid_dict

def getParentInfo(pid):
    """
    Returns a PID, Name tuple of the parent process for the argument pid process.
    """
    pid_info = getPIDInfo()
    ppid = pid_info[pid]['parent_id']
    return ppid, pid_info[ppid]['name']

if __name__ == "__main__":
    """
    Print the current PID and information of the parent process.
    """
    pid = os.getpid()
    ppid, ppname = getParentInfo(pid)

    print "This PID: %s. Parent PID: %s, Parent process name: %s" % (pid, ppid, ppname)
    dummy = raw_input()

При запуске из командной строки выводит:

Этот PID: 148. PID родительского: 4660, Имя родительского процесса: cmd

При запуске двойным щелчком в проводнике выводит:

Этот PID: 1896. PID родительского: 3788, Имя родительского процесса: explorer

3 голосов
/ 18 февраля 2009

Запущенный в командной строке сценарий имеет родительский процесс с именем cmd.exe (или несуществующий процесс, если консоль была закрыта в это время).

В скрипте, запускаемом двойным щелчком, должен быть родительский процесс с именем explorer.exe.

2 голосов
/ 18 февраля 2009

Хороший вопрос. Одна вещь, которую вы могли бы сделать, это создать ярлык для скрипта в Windows и передать аргументы (используя свойство Target ярлыка), которые будут обозначать, что скрипт был запущен двойным щелчком (в данном случае ярлык).

0 голосов
/ 08 августа 2016

Я поместил эту маленькую функцию (pybyebye ()) перед оператором return в некоторых моих программах. Я протестировал его под Windows 10 на своем настольном компьютере и ноутбуке, и он делает то, что я хочу, то есть он приостанавливает ожидание ввода пользователя только тогда, когда программа была запущена двойным щелчком мыши по программе в проводнике. Это предотвращает исчезновение временного окна команд до того, как пользователь скажет об этом. Под Linux это ничего не делает. В любом случае никакого вреда! Аналогично на Mac.

##  PYBYEBYE :
def pybyebye (eprompt="PROMPT",efps="FPS_BROWSER_"):
    "nice exit in Windows according to program launch from: IDLE, command, clix."

##  first examine environment (os & sys having been imported) :
ui = None
platform = sys.platform
##  print("os =",platform)
if not platform.lower().startswith("win"):
    return  ui  ##  only relevant in windows
fromidle = False
launched = "Launched from"
if sys.executable.endswith("pythonw.exe"):
    fromidle = True  ##  launched from within IDLE
envkeys = sorted(os.environ)
prompter = eprompt in envkeys
browser = False
for ek in envkeys:
    ##  print(ek)
    if ek.startswith(efps):
        browser = True
        break
##  next decide on launch context :
if fromidle and not prompter:  ##  surely IDLE
    ##  print(launched,"IDLE")
    pass  ##  screen won't disappear
elif browser and not prompter:  ##  run with double click
    ##  print(launched,"File Explorer")
    print("Press Enter to finish ....") ; ui=input()
elif prompter and not fromidle:  ##  run from preexisting command window
    ##  print(launched,"Command Window")
    pass  ##  screen won't disappear
else:  ##  something funny going on, Mac or Linux ??
    print("launch mode undetermined!")

return  ui
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...