Posted Community Wiki because this is a question already asked and answered elsewhere in the knowledgebase.
Doing this correctly (but for the removal of the cut in favor of native-Python string manipulation) might look something like:
glob_str = path2 + "IM" + path1 + "*_GM.nii.gz"
glob_list = glob.glob(glob_str)
if len(glob_list) == 0:
    raise Exception("No results found from glob expression %r" % glob_str)
for qq in range (0, 5, 1):
    lower = qq - 0.5
    upper = qq + 0.5
    args = ['fslstats'] + glob_list + [ '-l', str(lower), '-u', str(upper), '-V' ]
    ### EVERYTHING BELOW HERE IS UNNECESSARILY COMPLICATED BY THE USE OF 'cut'
    ### CONSIDER REPLACING WITH THE ALTERNATE IMPLEMENTATION  BELOW.
    p1 = subprocess.Popen(args, stdout=subprocess.PIPE)
    p1.stdout.close()
    p2 = subprocess.Popen(['cut', '-d', ' ', '-f1'], stdin=p1.stdout)
    (stdout, _) = p2.communicate()
    if p1.wait() != 0:
      raise Exception("fslstats run as %r returned exit status %r" % (args, p1.returncode))
    print("Result is: %r" % (stdout.split("\n"),))
To remove cut, you might change everything below the line assigning args as follows:
    stdout = subprocess.check_output(args)
    first_column = [ line.split()[0] for line in stdout.split('\n') ]
    print("Result is: %r" % first_column)
Note:
- We're not using 
shell=True. Keeping this disabled makes for an implementation where you have more control -- a shell isn't doing things behind your back, and you don't need to know how that shell works and how it's implemented to avoid (potentially security-impacting) bugs. 
- To implement a pipeline without 
shell=True, we're following the practices documented at https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline 
- We're actually passing the values of the 
lower  and upper variables, instead of passing the command lower and upper strings. 
- We're not joining our glob results into a string (which would break our command if any filenames resulting from that glob contained spaces), but are instead passing the list directly on the argument list for 
fslstats. 
- Because you care about the exit status of 
fslstats, not cut, you need to check that yourself. (Even with shell=True, you get default shell behavior, which returns only the exit status of the last pipeline component).