def _call(user_entry_point, args=None, env_vars=None, wait=True, capture_error=False): # type: (str, list, dict, bool, bool) -> Popen args = args or [] env_vars = env_vars or {} entrypoint_type = entry_point_type(_env.code_dir, user_entry_point) if entrypoint_type is EntryPointType.PYTHON_PACKAGE: cmd = [_process.python_executable(), '-m', user_entry_point.replace('.py', '')] + args elif entrypoint_type is EntryPointType.PYTHON_PROGRAM: cmd = [_process.python_executable(), user_entry_point] + args else: cmd = ['/bin/sh', '-c', './%s %s' % (user_entry_point, ' '.join(args))] _logging.log_script_invocation(cmd, env_vars) if wait: return _process.check_error(cmd, _errors.ExecuteUserScriptError, capture_error=capture_error) else: return _process.create(cmd, _errors.ExecuteUserScriptError, capture_error=capture_error)
def run(module_name, args=None, env_vars=None, wait=True, capture_error=False): # type: (str, list, dict, bool, bool) -> subprocess.Popen """Run Python module as a script. Search sys.path for the named module and execute its contents as the __main__ module. Since the argument is a module name, you must not give a file extension (.py). The module name should be a valid absolute Python module name, but the implementation may not always enforce this (e.g. it may allow you to use a name that includes a hyphen). Package names (including namespace packages) are also permitted. When a package name is supplied instead of a normal module, the interpreter will execute <pkg>.__main__ as the main module. This behaviour is deliberately similar to the handling of directories and zipfiles that are passed to the interpreter as the script argument. Note This option cannot be used with built-in modules and extension modules written in C, since they do not have Python module files. However, it can still be used for precompiled modules, even if the original source file is not available. If this option is given, the first element of sys.argv will be the full path to the module file (while the module file is being located, the first element will be set to "-m"). As with the -c option, the current directory will be added to the start of sys.path. You can find more information at https://docs.python.org/3/using/cmdline.html#cmdoption-m Example: >>>import sagemaker_containers >>>from sagemaker_containers.beta.framework import mapping, modules >>>env = sagemaker_containers.training_env() {'channel-input-dirs': {'training': '/opt/ml/input/training'}, 'model_dir': '/opt/ml/model', ...} >>>hyperparameters = env.hyperparameters {'batch-size': 128, 'model_dir': '/opt/ml/model'} >>>args = mapping.to_cmd_args(hyperparameters) ['--batch-size', '128', '--model_dir', '/opt/ml/model'] >>>env_vars = mapping.to_env_vars() ['SAGEMAKER_CHANNELS':'training', 'SAGEMAKER_CHANNEL_TRAINING':'/opt/ml/input/training', 'MODEL_DIR':'/opt/ml/model', ...} >>>modules.run('user_script', args, env_vars) SAGEMAKER_CHANNELS=training SAGEMAKER_CHANNEL_TRAINING=/opt/ml/input/training \ SAGEMAKER_MODEL_DIR=/opt/ml/model python -m user_script --batch-size 128 --model_dir /opt/ml/model Args: module_name (str): module name in the same format required by python -m <module-name> cli command. args (list): A list of program arguments. env_vars (dict): A map containing the environment variables to be written. capture_error (bool): Default false. If True, the running process captures the stderr, and appends it to the returned Exception message in case of errors. """ args = args or [] env_vars = env_vars or {} cmd = [_process.python_executable(), "-m", module_name] + args _logging.log_script_invocation(cmd, env_vars) if wait: return _process.check_error(cmd, _errors.ExecuteUserScriptError, capture_error=capture_error) else: return _process.create(cmd, _errors.ExecuteUserScriptError, capture_error=capture_error)
def test_create_error(): with pytest.raises(_errors.ExecuteUserScriptError): _process.create(["run"], _errors.ExecuteUserScriptError)