Как сделать мягкий перезапуск в Python 3, не выходя из Python? - PullRequest
0 голосов
/ 31 августа 2018

Я разрабатываю сценарий Python 3, чтобы выполнить то, что я ранее достиг с помощью сценариев Windows Batch и / или GNU / Linux. Основная причина заключается в том, что моя организация использует как Windows, так и GNU / Linux, и нам нужен один сценарий, который будет работать на обеих платформах (проще в обслуживании, теоретически).

Мой сценарий оболочки будет упрощен до

python name-of-python-script.py

Я полагаю, что моя текущая задача будет упрощена, если я смогу выполнить мягкий перезапуск в течение одного сеанса Python. (Мой зависимый от платформы скрипт вызывает последовательность независимых экземпляров Python, каждый из которых имеет свой собственный импорт, создание объекта и т. Д. Несоблюдение независимости сеансов Python может привести к конфликтам имен.)

Одно из решений для скрипта Python:

# Beginning of Python Script
DIR = set(dir()).union({'DIR'}) # Remember what's in start-up scope
# Create a bunch of objects, do a bunch of function calls, etc. (#1)
exec('del ' + ', '.join(filter(lambda s: s not in DIR, dir()))) # Soft restart (#2)
# Alternate between #1 and #2

Мое настоящее решение:

restore = \
'''
for name in dir():
    part = name.partition('__')
    if name in ('restore', 'name', 'part'):
        pass # name is being used in-loop: don't delete
    elif part[0]: # name does not begin with '__'
        exec('del ' + name)
    elif part[1] == '__': # name begins with '__'
        part = ''.join(reversed(part[2])).partition('__')
        if part[0]: # name does not end with '__'
            exec('del ' + name)
    else:
        pass

del name, part
'''
# usage: exec(restore)

Что является более элегантным решением? В частности, для первого решения я заинтересован в том, чтобы избежать необходимости копировать дословно # 2 каждый раз, когда я хочу сделать мягкий перезапуск. Оба решения требуют exec, что было бы неплохо избежать.

Я подтверждаю обратную связь до сих пор (2018-12-08); все еще работает над минимальным примером.

...