Я разрабатываю сценарий 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); все еще работает над минимальным примером.