0

I got a very strange behaviour with subprocess.check_out:

I want to get the grep -c result:

In [50]: !grep -c 'def ' repos/clara.aaa_hotmail.com/*.py
0
In [52]: !grep -c 'def ' repos/saad.aaa_gmail.com/*.py
3
In [53]:

with this one I get it well

In [53]: from subprocess import check_output
In [54]: check_output([f"grep -c 'def ' repos/saad.aaa_gmail.com/*.py"], shell=True)
Out[54]: b'3\n'

with the other:

In [55]: check_output([f"grep -c 'def ' repos/clara.aaa_hotmail.com/*.py"], shell=True)
---------------------------------------------------------------------------
CalledProcessError                        Traceback (most recent call last)
<ipython-input-55-6c66bfb457a5> in <module>
----> 1 check_output([f"grep -c 'def ' repos/clara.aaa_hotmail.com/*.py"], shell=True)

/usr/lib/python3.8/subprocess.py in check_output(timeout, *popenargs, **kwargs)
    413         kwargs['input'] = empty
    414 
--> 415     return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
    416                **kwargs).stdout
    417 

/usr/lib/python3.8/subprocess.py in run(input, capture_output, timeout, check, *popenargs, **kwargs)
    514         retcode = process.poll()
    515         if check and retcode:
--> 516             raise CalledProcessError(retcode, process.args,
    517                                      output=stdout, stderr=stderr)
    518     return CompletedProcess(process.args, retcode, stdout, stderr)

CalledProcessError: Command '["grep -c 'def ' repos/clara.aaa_hotmail.com/*.py"]' returned non-zero exit status 1.

In [56]:

Note: we are not dealing with pipe | Cf. python subprocess.check_output doesn't return when cat | grep combination

user3313834
  • 7,327
  • 12
  • 56
  • 99
  • `grep` returns an exit status of 1 if the pattern wasn't found. If you don't consider a match count of zero as being an error, then `check_output()` isn't the appropriate `subprocess` function to use. – jasonharper Jun 04 '22 at 19:43
  • so what could be the appropriate subprocess ? – user3313834 Jun 04 '22 at 22:12

1 Answers1

1

You can replace subprocess.check_output with subprocess.run and add the capture_output=True

>>> from subprocess import run
>>> run([f"grep -c 'def ' repos/saad.aaa_gmail.com/*.py"],
        shell=True, capture_output=True)
b'3\n'
>>>
user3313834
  • 7,327
  • 12
  • 56
  • 99
Vanessa C
  • 26
  • 1