diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index a04d6c403ee..a7af7167af0 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -939,7 +939,7 @@ class AnsibleModule(object): # rename might not preserve context self.set_context_if_different(dest, context, False) - def run_command(self, args, check_rc=False, close_fds=False, executable=None, data=None, binary_data=False): + def run_command(self, args, check_rc=False, close_fds=False, executable=None, data=None, binary_data=False, path_prefix=None): ''' Execute a command, returns rc, stdout, and stderr. args is the command to run @@ -963,16 +963,33 @@ class AnsibleModule(object): rc = 0 msg = None st_in = None + + # Set a temporart env path if a prefix is passed + env=os.environ + if path_prefix: + env['PATH']="%s:%s" % (path_prefix, env['PATH']) + if data: st_in = subprocess.PIPE try: - cmd = subprocess.Popen(args, - executable=executable, - shell=shell, - close_fds=close_fds, - stdin=st_in, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + if path_prefix is not None: + cmd = subprocess.Popen(args, + executable=executable, + shell=shell, + close_fds=close_fds, + stdin=st_in, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env) + else: + cmd = subprocess.Popen(args, + executable=executable, + shell=shell, + close_fds=close_fds, + stdin=st_in, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + if data: if not binary_data: data += '\\n' diff --git a/library/packaging/pip b/library/packaging/pip index 49067dc1196..3b054aa7c47 100644 --- a/library/packaging/pip +++ b/library/packaging/pip @@ -275,6 +275,16 @@ def main(): pip = _get_pip(module, env, module.params['executable']) cmd = '%s %s' % (pip, state_map[state]) + + # If there's a virtualenv we want things we install to be able to use other + # installations that exist as binaries within this virtualenv. Example: we + # install cython and then gevent -- gevent needs to use the cython binary, + # not just a python package that will be found by calling the right python. + # So if there's a virtualenv, we add that bin/ to the beginning of the PATH + # in run_command by setting path_prefix here. + path_prefix = None + if env: + path_prefix="/".join(pip.split('/')[:-1]) if extra_args: cmd += ' %s' % extra_args @@ -320,7 +330,7 @@ def main(): os.chdir(tempfile.gettempdir()) if chdir: os.chdir(chdir) - rc, out_pip, err_pip = module.run_command(cmd) + rc, out_pip, err_pip = module.run_command(cmd, path_prefix=path_prefix) out += out_pip err += err_pip if rc == 1 and state == 'absent' and 'not installed' in out_pip: