У меня есть скрипт bash, который выглядит следующим образом:
#!/bin/bash
{
var1='stuff'
var2='more stuff'
cd path/to/package &&
python setup.py install &&
printf "Ok, we're gonna run this bad boy" &&
(
printf "Training" &&
python -u script1.py "${var1}" "${var2}" &&
printf "Testing" &&
python -u script2.py "${var1}"
) 2>&1 | tee log.txt
exit
}
Скрипт bash запускается script1.py
, а когда он заканчивается, он запускается script2.py
.
Настройка:
script1.py
считывает некоторые данные с помощью некоторых методов, определенных в других скриптах Python, затем создает экземпляр класса, определенного в script3.py
, и вызываетtrain()
метод в этом классе. Этот train()
метод работает в течение нескольких часов . Когда этот метод train()
возвращает, script1.py
также возвращает.
script2.py
читает некоторые данные через некоторые методы, определенные в других скриптах Python, затем создает экземпляр класса, определенного в script3.py
, и вызываетtest()
метод в этом классе. Этот test()
метод работает в течение нескольких часов . Когда этот метод test()
возвращается, script2.py
также возвращается.
script3.py
и скрипты Python, которые выполняют чтение данных, являются частью пакета Python.
script3.py
выглядит такthis:
class MyClass():
some_var = '' # Enum value
def __init__(self):
print('Initialized this bad boy')
def train(self, param1, param2):
# some code goes here, uses class variable some_var
def test(self, param1, param2):
# some code goes here, uses class variable some_var
Мой поток выглядит следующим образом:
- Я редактирую исходный код в
script3.py
, где я изменяю переменную класса some_var
. - Я запускаю скрипт bash. (обратите внимание, что сначала запускается скрипт
python setup.py install
) - Я редактирую исходный код в
script3.py
, где меняю ту же переменную класса. - Я запускаю скрипт bash. (обратите внимание, что скрипт сначала запускается
python setup.py install
, также обратите внимание, что запущен до того, как метод train()
вернет ) - Повторите это несколько раз.
То, что я ожидаю, произойдет:
Я ожидаю, что при запуске сценария bash, сценарий bash и сценарии Python загружаются в память и затем выполняются по мере необходимости. В частности:
- метод
train()
из script3.py
выполняется со значением some_var
, затем возвращается, script1.py
также возвращает - метод
test()
из script3.py
выполняется с тем же значением some_var
, затем возвращается, script2.py
также возвращает
Что на самом деле происходит:
Допустим, я запускаю свой скрипт bash 3раз в течение нескольких минут. Из-за того, что методу train()
требуется несколько часов для выполнения, к тому времени, когда выполнение достигает метода test()
, переменная класса some_var
изменяется на последнее редактирование исходного кода, поэтому во всех 3 прогонах используется одинаковое значениеsome_var
, в частности значение, установленное в последнем редактировании, перед запуском сценария bash в третий раз.
Быстрое исправление:
БыстроеИсправить можно было бы отредактировать script3.py
, чтобы он выглядел так:
class MyClass():
some_var = 'value1' # Enum value
def __init__(self):
print('Initialized this bad boy')
def train(self, param1, param2):
self.some_var = 'value1'
# some code goes here, uses class variable some_var
def test(self, param1, param2):
self.some_var = 'value1'
# some code goes here, uses class variable some_var
Однако это было бы плохим качеством кода и также нецелесообразно, так как теперь мне придется изменить some_var
в 3 местах перед каждым запуском скрипта bash. Если подумать, это не сработает. Он будет вести себя одинаково, всегда использовать значение из последнего редактирования.
Вопрос:
Что может быть лучше для достижения этой цели?
I 'Я думаю, что должен быть способ загрузки скриптов Python в память во время всего выполнения скрипта bash.
Ограничения (поскольку это является частью большого проекта):
- Я не могу передать дополнительные параметры в
train()
или test()
методах script3.py
из script1.py
или script2.py
. - Я не могу передать аргументы командной строки
script3.py
.