变量继承

之前的章节中,我们看到如何为 task 定义变量(variable)。 当同一 family 下的所有 task 都共享同一个变量值时, 该值可以定义在 family 层。这就是变量继承(variable inheritance)。

下面的例子中,也可将变量定义在 suite 层,得到相同的结果。

变量从父节点继承。子节点(node)可以重新定义变量,这种情况下使用新的变量值。 生成的变量(generated variables)也可以重新定义,但不推荐这么做,除非你很清楚可能出现的后果。

Suite Definition

Text

  1. # Definition of the suite test.
  2. suite test
  3. edit ECF_INCLUDE "$ECF_HOME" # replace '$ECF_HOME' with the path to your ECF_HOME directory
  4. edit ECF_HOME "$ECF_HOME"
  5. family f1
  6. edit SLEEP 20
  7. task t1
  8. task t2
  9. endfamily
  10. endsuite

Python

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Family, Edit
  4. def create_family_f1():
  5. return Family(
  6. "f1",
  7. Edit(SLEEP=20),
  8. Task("t1"),
  9. Task("t2"))
  10. print("Creating suite definition")
  11. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  12. defs = Defs(
  13. Suite('test',
  14. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  15. create_family_f1()))
  16. print(defs)
  17. print("Checking job creation: .ecf -> .job0")
  18. print(defs.check_job_creation())
  19. print("Saving definition to file 'test.def'")
  20. defs.save_as_defs(str(Path(home, "test.def")))
  21. # To restore the definition from file 'test.def' we can use:
  22. # restored_defs = ecflow.Defs("test.def")

生成的 def 文件

  1. $python test.py
  2. Creating suite definition
  3. # 4.8.0
  4. suite test
  5. edit ECF_INCLUDE '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  6. edit ECF_HOME '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  7. family f1
  8. edit SLEEP '20'
  9. task t1
  10. task t2
  11. endfamily
  12. endsuite
  13. Checking job creation: .ecf -> .job0
  14. Saving definition to file 'test.def'

变量继承 - 图1

测试

如下的 suite definition

  1. suite test
  2. edit SLEEP 100
  3. family f1
  4. edit SLEEP 80
  5. task t1
  6. task t2
  7. edit SLEEP 9
  8. family g1
  9. edit SLEEP 89
  10. task x1
  11. edit SLEEP 10
  12. task x2
  13. endfamily
  14. endfamily
  15. family f2
  16. task t1
  17. task t2
  18. edit SLEEP 77
  19. family g2
  20. task x1
  21. edit SLEEP 12
  22. task x2
  23. endfamily
  24. endfamily
  25. endsuite

上面 suite 的 SLEEP 值

node SLEEP
/test/f1/t1 80
/test/f1/t2 9
/test/f1/g1/x1 10
/test/f1/g1/x2 89
/test/f2/t1 100
/test/f2/t2 77
/test/f2/g2/x1 12
/test/f2/g2/x2 100

变量继承 - 图2

任务

  1. 修改
  2. 替换 suite
  3. 在 ecflow_ui 中查看修改后的 suite test