You would see this in python 2, if the the subprocess died having received SIGTERM (i.e. 15). Since you've used shell=True, this mean the /bin/sh process wrapping your call got killed with (received signal) SIGTERM (and terminated).
Python 3 output would be perhaps a bit more helpful as to hinting the cause in this case:
subprocess.CalledProcessError: Command 'lspci | egrep -i "virtio network" | wc -l' died with <Signals.SIGTERM: 15>.
Looking at your line:
subprocess.check_output('lspci | egrep -i "virtio network" | wc -l', shell=True)
Perhaps it would make sense to try this:
len([l for l
in subprocess.check_output('lspci').lower().splitlines()
if b"virtio network" in l])
Instead of wrapping the call in a shell instance and forking multiple processes to get number of lines with certain string, it retrieves output from lspci, converts it to lower case (to make the matches case insensitive like -i above) and splits the output on line boundaries. List comprehension based on the list of those lines gets us a resulting list of all lines limited to those containing the searched for str (or rather bytes to be py2/3 friendly) and len gives us an int of how many such lines there were.