У меня есть основной скрипт, из которого я хочу сделать пару временных копий с небольшими изменениями в каждой копии.
main.py
может выглядеть так:
import NumPy as np
import module
import bar
...
foo = bar(label='C2H4', point=(1,0))
atoms = 'H4'
template = read('template.t')
size = template.lengths()
n = 4
alpha = 0.5
batch_size = 256 // (n * alpha)
dct = {
'1': [1, 2],
'6': [3, 4],
}
kwargs = {
'dict': dct,
'size': size,
'scale': size[0] / 10,
}
...
module(atoms, kwargs, foo)
module.run()
В другом сценарии, называемом parameter_search.py
, я делаю копию и изменяю параметры, выполняя каждую строку в main.py
в поисках того, что следует изменить.
Если переменная найдена, a Команда regex разбивает строку, а затем изменяет число с плавающей точкой (я не лучший в регулярных выражениях, так что, возможно, это может потребовать некоторой работы):
import re
import fileinput
import os from shutil import copyfile
def is_num(var):
try:
float(var)
return True
except ValueError:
return False
def replace(filename, var_expr, new_val):
found = False
for line in fileinput.input(filename, inplace=1):
if var_expr in line:
if not found:
found = True
lst = re.split('(=|:|,)', line)
for i, char in enumerate(lst):
if is_num(char):
lst[i] = str(new_val)
line = "".join(lst)
else:
raise NameError(f'{var_expr} ambigous')
print(line, end="")
if not found:
raise NameError(f'{var_expr} not found in {filename}')
N = [10, 20]
alpha = [0.4, 0.6, 0.8]
foo = [bar(alpha=1), baz()]
for n in N:
for a in alpha:
for i, f in enumerate(foo):
newfile = 'main'
newfile += f'_n{n}'
newfile += f'_a{a}'
newfile += f'_f{i}'
newfile += '.py'
copyfile('main.py', newfile)
replace(newfile, 'n=', n)
replace(newfile, 'alpha=', use_n)
replace(newfile, 'foo = ', f)
Это дает приличные результаты, но проблемы возникают, если несколько переменные находятся в одной строке, например bar(label='C2H4', point=(1, 0))
, или переменная является частью dict как kwargs
, параметр является строкой, функцией или какой-то другой странной переменной.
Возможно ли сделать что-то вроде replace()
, что является более общим или каким-то другим образом делает это возможным?