def test_run_logcmd(): test_script = textwrap.dedent(""" #!/usr/bin/env bash echo output $@ exit 0 """).strip() expcmd = './script.sh 1 2 3\n' expstdout = 'output 1 2 3\n' with tempdir.tempdir(): mkexec('script.sh', test_script) with open('my_stdout', 'wt') as stdoutf: stdout = run.run('./script.sh 1 2 3', log={'cmd': stdoutf}) assert stdout == expstdout assert open('my_stdout', 'rt').read() == expcmd with open('my_stdout', 'wt') as stdoutf: stdout = run.run('./script.sh 1 2 3', log={ 'cmd': stdoutf, "stdout": stdoutf }) assert stdout == expstdout assert open('my_stdout', 'rt').read() == expcmd + expstdout
def test_run_tee(): test_script = textwrap.dedent(""" #!/bin/bash echo "standard output - arguments: $@" echo "standard error" >&2 exit 0 """).strip() with tempdir.tempdir(): mkexec('script.sh', test_script) expstdout = "standard output - arguments: 1 2 3\n" expstderr = "standard error\n" capture = CaptureStdout() with capture: stdout = run.run('./script.sh 1 2 3', log={'tee': True}) assert stdout == expstdout assert capture.stdout == expstdout with capture.reset(): stdout, stderr = run.run('./script.sh 1 2 3', stderr=True, log={'tee': True}) assert stdout == expstdout assert stderr == expstderr assert capture.stdout == expstdout assert capture.stderr == expstderr with capture.reset(): stdout, stderr, ret = run.run('./script.sh 1 2 3', stderr=True, exitcode=True, log={'tee': True}) assert ret == 0 assert stdout == expstdout assert stderr == expstderr assert capture.stdout == expstdout assert capture.stderr == expstderr with capture.reset(): stdout, ret = run.run('./script.sh 1 2 3', exitcode=True, log={'tee': True}) assert ret == 0 assert stdout == expstdout assert capture.stdout == expstdout
def test_run_streams(): """ """ test_script = textwrap.dedent(""" #!/usr/bin/env bash echo standard output echo standard error >&2 exit 0 """).strip() expstdout = 'standard output\n' expstderr = 'standard error\n' with tempdir.tempdir(): mkexec('./script.sh', test_script) with open('my_stdout', 'wt') as stdout, \ open('my_stderr', 'wt') as stderr: stdout, stderr = run.run('./script.sh', stderr=True, log={ 'stdout': stdout, 'stderr': stderr }) assert stdout == expstdout assert stderr == expstderr assert open('my_stdout', 'rt').read() == expstdout assert open('my_stderr', 'rt').read() == expstderr capture = CaptureStdout() with open('my_stdout', 'wt') as stdout, \ open('my_stderr', 'wt') as stderr, \ capture.reset(): stdout, stderr = run.run('./script.sh', stderr=True, log={ 'tee': True, 'stdout': stdout, 'stderr': stderr }) assert stdout == expstdout assert stderr == expstderr assert capture.stdout == expstdout assert capture.stderr == expstderr assert open('my_stdout', 'rt').read() == expstdout assert open('my_stderr', 'rt').read() == expstderr
def test_func_to_cmd(): cwd = os.getcwd() with tempdir(): for tmp_dir in (None, '.'): for clean in ('never', 'on_success', 'always'): for verbose in (False, True): cmd = fslsub.func_to_cmd(_good_func, clean=clean, tmp_dir=tmp_dir, verbose=verbose) fn = cmd.split()[-1] assert op.exists(fn) stdout, stderr, exitcode = run.run(cmd, exitcode=True, stdout=True, stderr=True, env={"PYTHONPATH": cwd}) assert exitcode == 0 if clean == 'never': assert op.exists( fn ), "Successful job got removed, even though this was not requested" else: assert not op.exists( fn ), f"Successful job did not get removed after run for clean = {clean}" if verbose: assert stdout.strip() == f'running {fn}\nhello' else: assert stdout.strip() == 'hello' cmd = fslsub.func_to_cmd(_bad_func, clean=clean, tmp_dir=tmp_dir) fn = cmd.split()[-1] assert op.exists(fn) stdout, stderr, exitcode = run.run(cmd, exitcode=True, stdout=True, stderr=True, env={'PYTHONPATH': cwd}) assert exitcode != 0 if clean == 'always': assert not op.exists( fn ), "Failing job should always be removed if requested" else: assert op.exists( fn ), f"Failing job got removed even with clean = {clean}"
def info(job_ids) -> Dict[str, Optional[Dict[str, str]]]: """Gets information on a given job id The ``info`` function is deprecated - you should use the ``fsl_sub.report`` function from the ``fsl_sub`` Python library, which is available in FSL 6.0.5 and newer. Uses `qstat -j <job_ids>` :arg job_ids: string with job id or (nested) sequence with jobs :return: dictionary of jobid -> another dictionary with job information (or None if job does not exist) """ if not hasattr(info, '_ncall'): info._ncall = 0 info._ncall += 1 if info._ncall == 3: warnings.warn("Please do not call `fslsub.info` repeatably, because it slows down the cluster. You can avoid this message by simply passing all the job IDs you are interested in to a single `fslsub.info` call.") from fsl.utils.run import run job_ids_string = _flatten_job_ids(job_ids) try: result = run(['qstat', '-j', job_ids_string], exitcode=True)[0] except FileNotFoundError: log.debug("qstat not found; assuming not on cluster") return {} return _parse_qstat(job_ids_string, result)
def test_run_submit(): def mkexec(path, contents): with open(path, 'wt') as f: f.write(contents) os.chmod(path, 0o755) test_script = textwrap.dedent(""" #!/usr/bin/env bash echo test_script running exit 0 """).strip() with tempdir.tempdir(), \ mockFSLDIR(), \ mock.patch('fsl.utils.fslsub.submit', mock_submit): mkexec(op.expandvars('$FSLDIR/bin/fsltest'), test_script) jid = run.run('fsltest', submit=True) assert jid == '12345' stdout, stderr = fslsub.output(jid) assert stdout == 'test_script running\n' assert stderr == '' # or can pass submit opts as a dict kwargs = {'name': 'abcde', 'ram': '4GB'} jid = run.run('fsltest', submit=kwargs) assert jid == '12345' stdout, stderr = fslsub.output(jid) experr = '\n'.join( ['{}: {}'.format(k, kwargs[k]) for k in sorted(kwargs.keys())]) + '\n' assert stdout == 'test_script running\n' assert stderr == experr # or can pass submit opts as kwargs kwargs = {'name': 'abcde', 'ram': '4GB'} jid = run.run('fsltest', submit=True, **kwargs) assert jid == '12345' stdout, stderr = fslsub.output(jid) experr = '\n'.join( ['{}: {}'.format(k, kwargs[k]) for k in sorted(kwargs.keys())]) + '\n' assert stdout == 'test_script running\n' assert stderr == experr
def test_dryrun(): test_script = textwrap.dedent(""" #!/bin/bash touch foo """).strip() with tempdir.tempdir(): mkexec('./script.sh', test_script) run.run('./script.sh') assert op.exists('foo') os.remove('foo') with run.dryrun(): run.run('./script.sh') assert not op.exists('foo')
def test_run_passthrough(): test_script = textwrap.dedent(""" #!/bin/bash echo "env: $RUN_TEST_ENV_VAR" """).strip() with tempdir.tempdir(): # return code == 0 mkexec('script.sh', test_script.format(0)) env = {'RUN_TEST_ENV_VAR': 'howdy ho'} expstdout = "env: howdy ho\n" assert run.run('./script.sh', env=env) == expstdout
def mock_submit(cmd, **kwargs): if isinstance(cmd, six.string_types): name = cmd.split()[0] else: name = cmd[0] name = op.basename(name) jid = '12345' output = run.run(cmd) with open('{}.o{}'.format(name, jid), 'wt') as f: f.write(output) with open('{}.e{}'.format(name, jid), 'wt') as f: for k in sorted(kwargs.keys()): f.write('{}: {}\n'.format(k, kwargs[k])) return jid
#!/usr/bin/env python # Script to publish the documentation on jalapeno from fsl.utils.run import run import os.path as op from sphinx.cmd.build import main main(('doc', 'doc/html')) target = op.expanduser("~/www/doc/mcot/core") if op.isdir(target): run(f"rsync -aP doc/html/ {target}/")
def test_run(): test_script = textwrap.dedent(""" #!/bin/bash echo "standard output - arguments: $@" echo "standard error" >&2 exit {} """).strip() with tempdir.tempdir(): # return code == 0 mkexec('script.sh', test_script.format(0)) expstdout = "standard output - arguments: 1 2 3\n" expstderr = "standard error\n" # test: # - single string # - packed sequence # - unpacked sequence assert run.run('./script.sh 1 2 3') == expstdout assert run.run(('./script.sh', '1', '2', '3')) == expstdout assert run.run(*('./script.sh', '1', '2', '3')) == expstdout # test stdout/stderr stdout, stderr = run.run('./script.sh 1 2 3', stderr=True) assert stdout == expstdout assert stderr == expstderr # test return code res = run.run('./script.sh 1 2 3', exitcode=True) stdout, ret = res assert stdout == expstdout assert ret == 0 stdout, stderr, ret = run.run('./script.sh 1 2 3', stderr=True, exitcode=True) assert stdout == expstdout assert stderr == expstderr assert ret == 0 # stdout=False res = run.run('./script.sh 1 2 3', stdout=False) assert res == () stderr = run.run('./script.sh 1 2 3', stdout=False, stderr=True) assert stderr == expstderr # return code != 0 mkexec('./script.sh', test_script.format(255)) with pytest.raises(RuntimeError): run.run('./script.sh 1 2 3') stdout, ret = run.run('./script.sh 1 2 3', exitcode=True) assert stdout == expstdout assert ret == 255
def test_cmdonly(): assert run.run('script.sh', cmdonly=True) == ['script.sh'] assert run.run('script.sh 1 2 3', cmdonly=True) == ['script.sh', '1', '2', '3'] assert run.run(['script.sh'], cmdonly=True) == ['script.sh'] assert run.run(['script.sh', '1'], cmdonly=True) == ['script.sh', '1']