我有一个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
看起来像这样:
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
。 python setup.py install
)script3.py
中编辑源代码,在其中更改相同的类变量。python setup.py install
,还请注意,该脚本是在train()
方法返回之前启动的)我希望发生的事情:
我希望当我运行bash脚本时,bash脚本和Python脚本会加载到内存中,然后根据需要执行。具体来说:
train()
中的script3.py
方法以值some_var
运行,然后返回,script1.py
也返回test()
中的script3.py
方法以相同的some_var
值运行,然后返回,script2.py
也返回实际发生的情况:
假设我在几分钟内运行了3次bash脚本。由于train()
方法需要几个小时才能执行,因此当执行到达test()
方法时,类变量some_var
会更改为源代码的最后编辑,因此所有这3个在第三次运行bash脚本之前,运行将使用相同的some_var
值,特别是在上一次编辑中设置的值。
快速修复:
一个快速解决方案是将 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
但是,这将导致代码质量低下并且不切实际,因为现在我必须在每次运行bash脚本之前的3个地方更改这是行不通的。行为相同,始终使用上次编辑的值。some_var
。
问题:
有什么更好的方法来实现这一目标?
我认为必须在整个bash脚本执行期间将Python脚本加载到内存中。
限制(由于这是一个更大的项目的一部分):
train()
或test()
的{{1}}的{{1}}或script3.py
方法中传递额外的参数。 script1.py
。