Загружать скрипты Python в память при запуске нескольких скриптов Python из скрипта bash - PullRequest
1 голос
/ 07 ноября 2019

У меня есть скрипт 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

Мой поток выглядит следующим образом:

  1. Я редактирую исходный код в script3.py, где я изменяю переменную класса some_var.
  2. Я запускаю скрипт bash. (обратите внимание, что сначала запускается скрипт python setup.py install)
  3. Я редактирую исходный код в script3.py, где меняю ту же переменную класса.
  4. Я запускаю скрипт bash. (обратите внимание, что скрипт сначала запускается python setup.py install, также обратите внимание, что запущен до того, как метод train() вернет )
  5. Повторите это несколько раз.

То, что я ожидаю, произойдет:

Я ожидаю, что при запуске сценария 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...