hpcflow.sdk.submission.shells package#
Submodules#
hpcflow.sdk.submission.shells.base module#
- class hpcflow.sdk.submission.shells.base.Shell(executable=None, os_args=None)#
Bases:
ABC
Class to represent a shell and templates for jobscript composition.
This class represents a combination of a shell and an OS. For example, running bash on a POSIX OS, and provides snippets that are used to compose a jobscript for that combination.
- property executable: List[str]#
- abstract get_version_info(exclude_os=False)#
Get shell and operating system information.
- Parameters:
exclude_os (bool | None) –
- Return type:
Dict
- prepare_JS_path(js_path)#
- Parameters:
js_path (Path) –
- Return type:
str
- prepare_element_run_dirs(run_dirs)#
- Parameters:
run_dirs (List[List[Path]]) –
- Return type:
List[List[str]]
- process_JS_header_args(header_args)#
- Parameters:
header_args (Dict) –
- Return type:
Dict
- property shebang_executable: List[str]#
hpcflow.sdk.submission.shells.bash module#
- class hpcflow.sdk.submission.shells.bash.Bash(*args, **kwargs)#
Bases:
Shell
Class to represent using bash on a POSIX OS to generate and submit a jobscript.
- DEFAULT_EXE = '/bin/bash'#
- JS_DIRECT_HEADER = '{shebang}\n\n{header}\n'#
- JS_ELEMENT_ARRAY = 'JS_elem_idx=$(({scheduler_array_item_var} - 1))\n{main}\ncd $WK_PATH\n'#
- JS_ELEMENT_LOOP = 'for ((JS_elem_idx=0;JS_elem_idx<{num_elements};JS_elem_idx++))\ndo\n{main}\ndone\ncd $WK_PATH\n'#
- JS_ENV_SETUP_INDENT = ' '#
- JS_EXT = '.sh'#
- JS_HEADER = '{workflow_app_alias} () {{\n(\n{env_setup}{app_invoc}\\\n --config-dir "{config_dir}"\\\n --config-invocation-key "{config_invoc_key}"\\\n "$@"\n)\n}}\n\nWK_PATH=`pwd`\nWK_PATH_ARG=$WK_PATH\nSUB_IDX={sub_idx}\nJS_IDX={js_idx}\nEAR_ID_FILE="$WK_PATH/artifacts/submissions/${{SUB_IDX}}/{EAR_file_name}"\nELEM_RUN_DIR_FILE="$WK_PATH/artifacts/submissions/${{SUB_IDX}}/{element_run_dirs_file_path}"\n'#
- JS_INDENT = ' '#
- JS_MAIN = 'elem_need_EARs=`sed "$((${{JS_elem_idx}} + 1))q;d" $EAR_ID_FILE`\nelem_run_dirs=`sed "$((${{JS_elem_idx}} + 1))q;d" $ELEM_RUN_DIR_FILE`\n\nfor ((JS_act_idx=0;JS_act_idx<{num_actions};JS_act_idx++))\ndo\n\n need_EAR="$(cut -d\'{EAR_files_delimiter}\' -f $(($JS_act_idx + 1)) <<< $elem_need_EARs)"\n if [ "$need_act" = "0" ]; then\n continue\n fi\n\n run_dir="$(cut -d\'{EAR_files_delimiter}\' -f $(($JS_act_idx + 1)) <<< $elem_run_dirs)"\n cd $WK_PATH/$run_dir\n\n {workflow_app_alias} internal workflow $WK_PATH_ARG write-commands $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n {workflow_app_alias} internal workflow $WK_PATH_ARG set-ear-start $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n . {commands_file_name}\n {workflow_app_alias} internal workflow $WK_PATH_ARG set-ear-end $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n\ndone\n'#
- JS_SCHEDULER_HEADER = '{shebang}\n\n{scheduler_options}\n{header}\n'#
- JS_SHEBANG = '#!{shebang_executable} {shebang_args}'#
- format_save_parameter(workflow_app_alias, param_name, shell_var_name)#
- format_stream_assignment(shell_var_name, command)#
- get_version_info(exclude_os=False)#
Get bash version information.
- Parameters:
exclude_os (bool | None) – If True, exclude operating system information.
- Return type:
Dict
- property linux_release_file#
- wrap_in_subshell(commands)#
Format commands to run within a subshell.
This assumes commands ends in a newline.
- Parameters:
commands (str) –
- Return type:
str
- class hpcflow.sdk.submission.shells.bash.WSLBash(WSL_executable=None, WSL_distribution=None, WSL_user=None, *args, **kwargs)#
Bases:
Bash
- Parameters:
WSL_executable (str | None) –
WSL_distribution (str | None) –
WSL_user (str | None) –
- DEFAULT_WSL_EXE = 'wsl'#
- JS_HEADER = '{workflow_app_alias} () {{\n(\n{env_setup}{app_invoc}\\\n --config-dir "{config_dir}"\\\n --config-invocation-key "{config_invoc_key}"\\\n "$@"\n)\n}}\n\nWK_PATH=`pwd`\nWK_PATH_ARG=`wslpath -m $WK_PATH`\nSUB_IDX={sub_idx}\nJS_IDX={js_idx}\nEAR_ID_FILE="$WK_PATH/artifacts/submissions/${{SUB_IDX}}/{EAR_file_name}"\nELEM_RUN_DIR_FILE="$WK_PATH/artifacts/submissions/${{SUB_IDX}}/{element_run_dirs_file_path}"\n'#
- property executable: List[str]#
- get_version_info(exclude_os=False)#
Get WSL and bash version information.
- Parameters:
exclude_os (bool | None) – If True, exclude operating system information.
- Return type:
Dict
- prepare_JS_path(js_path)#
- Parameters:
js_path (Path) –
- Return type:
str
- prepare_element_run_dirs(run_dirs)#
- Parameters:
run_dirs (List[List[Path]]) –
- Return type:
List[List[str]]
- process_JS_header_args(header_args)#
- property shebang_executable: List[str]#
hpcflow.sdk.submission.shells.os_version module#
- hpcflow.sdk.submission.shells.os_version.get_OS_info()#
- Return type:
Dict
- hpcflow.sdk.submission.shells.os_version.get_OS_info_POSIX(WSL_executable=None, use_py=True, linux_release_file=None)#
- Parameters:
WSL_executable (List[str] | None) – Executable to run subprocess calls via WSL on Windows.
use_py (bool | None) – If True, use the platform.uname Python function to get the OS information. Otherwise use subprocess to call uname. We set this to False when getting OS info in WSL on Windows, since we need to call the WSL executable.
linux_release_file (str | None) – If on Linux, record the name and version fields from this file.
- hpcflow.sdk.submission.shells.os_version.get_OS_info_windows()#
- Return type:
Dict
hpcflow.sdk.submission.shells.powershell module#
- class hpcflow.sdk.submission.shells.powershell.WindowsPowerShell(*args, **kwargs)#
Bases:
Shell
Class to represent using PowerShell on Windows to generate and submit a jobscript.
- DEFAULT_EXE = 'powershell.exe'#
- JS_DIRECT_HEADER = '{shebang}\n\n{header}\n'#
- JS_ELEMENT_LOOP = 'for ($JS_elem_idx = 0; $JS_elem_idx -lt {num_elements}; $JS_elem_idx += 1) {{\n{main}\n}}\nSet-Location $WK_PATH\n'#
- JS_ENV_SETUP_INDENT = ' '#
- JS_EXT = '.ps1'#
- JS_HEADER = 'function {workflow_app_alias} {{\n & {{\n{env_setup}{app_invoc} `\n --config-dir "{config_dir}" `\n --config-invocation-key "{config_invoc_key}" `\n $args\n }} @args\n}}\n\nfunction get_nth_line($file, $line) {{\n Get-Content $file | Select-Object -Skip $line -First 1\n}}\n\nfunction JoinMultiPath {{\n $numArgs = $args.Length\n $path = $args[0]\n for ($i = 1; $i -lt $numArgs; $i++) {{\n $path = Join-Path $path $args[$i]\n }}\n return $path\n}}\n\n$WK_PATH = $(Get-Location)\n$SUB_IDX = {sub_idx}\n$JS_IDX = {js_idx}\n$EAR_ID_FILE = JoinMultiPath $WK_PATH artifacts submissions $SUB_IDX {EAR_file_name}\n$ELEM_RUN_DIR_FILE = JoinMultiPath $WK_PATH artifacts submissions $SUB_IDX {element_run_dirs_file_path}\n'#
- JS_INDENT = ' '#
- JS_MAIN = '$elem_need_EARs = get_nth_line $EAR_ID_FILE $JS_elem_idx\n$elem_run_dirs = get_nth_line $ELEM_RUN_DIR_FILE $JS_elem_idx\n\nfor ($JS_act_idx = 0; $JS_act_idx -lt {num_actions}; $JS_act_idx += 1) {{\n\n $need_EAR = ($elem_need_EARs -split "{EAR_files_delimiter}")[$JS_act_idx]\n if ($need_EAR -eq 0) {{\n continue\n }}\n\n $run_dir = ($elem_run_dirs -split "{EAR_files_delimiter}")[$JS_act_idx]\n $run_dir_abs = "$WK_PATH\\$run_dir"\n Set-Location $run_dir_abs\n\n {workflow_app_alias} internal workflow $WK_PATH write-commands $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n {workflow_app_alias} internal workflow $WK_PATH set-ear-start $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n\n . (Join-Path $run_dir_abs "{commands_file_name}")\n {workflow_app_alias} internal workflow $WK_PATH set-ear-end $SUB_IDX $JS_IDX $JS_elem_idx $JS_act_idx\n\n}}\n'#
- JS_SHEBANG = ''#
- format_save_parameter(workflow_app_alias, param_name, shell_var_name)#
- format_stream_assignment(shell_var_name, command)#
- get_version_info(exclude_os=False)#
Get powershell version information.
- Parameters:
exclude_os (bool | None) – If True, exclude operating system information.
- Return type:
Dict
- wrap_in_subshell(commands)#
Format commands to run within a child scope.
This assumes commands ends in a newline.
- Parameters:
commands (str) –
- Return type:
str
Module contents#
- hpcflow.sdk.submission.shells.get_shell(shell_name, os_name=None, **kwargs)#
- Parameters:
os_name (str | None) –
- Return type: