### Summary

When using `ansible.builtin.pip`, if you wish to create a virtualenv using the `venv` module rather than one of the `virtualenv` wrapper script, the standard way to do so is `virtualenv_command: "FOO -m venv"`, where FOO is the absolute path to the Python interpreter you wish to use, e.g. `/usr/bin/python3.6`.

However, if you wrap the 'venv' module name in quotes, to protect it as a shell string literal (e.g. `virtualenv_command: "/usr/bin/python3.6 -m 'venv'"`), an error occurs.

Related: https://github.com/ansible/ansible/issues/52275

### Issue Type

Bug Report

### Component Name

ansible.builtin.pip

### Ansible Version

```console
$ ansible --version
ansible [core 2.11.6]
  config file = None
  configured module search path = ['/home/votisupport/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/votisupport/test/venv/lib64/python3.6/site-packages/ansible
  ansible collection location = /home/votisupport/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/votisupport/test/venv/bin/ansible
  python version = 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
  jinja version = 3.0.3
  libyaml = True
```


### Configuration

```console
$ ansible-config dump --only-changed
```


### OS / Environment

CentOS Linux release 7.9.2009 (Core)

### Steps to Reproduce

```yaml
  - name: "Demonstrate Ansible bug"

    hosts: "127.0.0.1"
    remote_user: "root"
    connection: "local"
    become: true
    become_user: "root"

    gather_facts: false

    tasks:
      - name: "Update pip in test virtualenv"
        ansible.builtin.pip:
          name:
            - "pip==21.1.2"
          virtualenv: "/test_venv"
          virtualenv_command: "/usr/bin/python3.6 -m 'venv'"
```


### Expected Results

* The value `/usr/bin/python3.6 -m venv` is treated as an executable path followed by 2 command-line arguments rather than a path which contains literal spaces in it
* One of the example values given in [the documentation for the 'virtualenv_command' parameter](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/pip_module.html#parameter-virtualenv_command) is `~/bin/virtualenv`
* Therefore the value is being passed to and parsed by a shell
* Therefore:
  a. `/usr/bin/python3.6 -m 'venv'` should be functionally identical to `/usr/bin/python3.6 -m venv`
  b. Per shell scripting best practices, 'venv' should be quoted, even though it doesn't contain any whitespace or special characters, because it is a command-line argument which can take an arbitrary string values.


### Actual Results

```console
(venv) [REDACTED@REDACTED test]$ ansible-playbook -vvvv 'playbook.yml'
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]. This feature will be removed from ansible-core in version 2.12.
 Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
ansible-playbook [core 2.11.6]
  config file = None
  configured module search path = ['/home/REDACTED/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/REDACTED/test/venv/lib64/python3.6/site-packages/ansible
  ansible collection location = /home/REDACTED/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/REDACTED/test/venv/bin/ansible-playbook
  python version = 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
  jinja version = 3.0.3
  libyaml = True
No config file found; using defaults
setting up inventory plugins
host_list declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
Skipping due to inventory source not existing or not being readable by the current user
script declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
auto declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
Skipping due to inventory source not existing or not being readable by the current user
yaml declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
Skipping due to inventory source not existing or not being readable by the current user
ini declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
Skipping due to inventory source not existing or not being readable by the current user
toml declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
Loading callback plugin default of type stdout, v2.0 from /home/REDACTED/test/venv/lib64/python3.6/site-packages/ansible/plugins/callback/default.py
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.

PLAYBOOK: playbook.yml ********************************************************************************************************************************************************************************************************************************************************
Positional arguments: playbook.yml
verbosity: 4
connection: smart
timeout: 10
become_method: sudo
tags: ('all',)
inventory: ('/etc/ansible/hosts',)
forks: 5
1 plays in playbook.yml

PLAY [Demonstrate Ansible bug] ************************************************************************************************************************************************************************************************************************************************
META: ran handlers

TASK [Update pip in test virtualenv] ******************************************************************************************************************************************************************************************************************************************
task path: /home/REDACTED/test/playbook.yml:12
<127.0.0.1> ESTABLISH LOCAL CONNECTION FOR USER: REDACTED
<127.0.0.1> EXEC /bin/sh -c 'echo ~REDACTED && sleep 0'
<127.0.0.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /home/REDACTED/.ansible/tmp `"&& mkdir "` echo /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678 `" && echo ansible-tmp-1637837031.3618085-76233-273600869189678="` echo /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678 `" ) && sleep 0'
Using module file /home/REDACTED/test/venv/lib64/python3.6/site-packages/ansible/modules/pip.py
<127.0.0.1> PUT /home/REDACTED/.ansible/tmp/ansible-local-76226li2q81vb/tmptxkwmgu5 TO /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678/AnsiballZ_pip.py
<127.0.0.1> EXEC /bin/sh -c 'chmod u+x /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678/ /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678/AnsiballZ_pip.py && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'sudo -H -S -n  -u root /bin/sh -c '"'"'echo BECOME-SUCCESS-ofcnvczhymkuiiofkpnkkjeubhdkhtym ; /home/REDACTED/test/venv/bin/python3.6 /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678/AnsiballZ_pip.py'"'"' && sleep 0'
<127.0.0.1> EXEC /bin/sh -c 'rm -f -r /home/REDACTED/.ansible/tmp/ansible-tmp-1637837031.3618085-76233-273600869189678/ > /dev/null 2>&1 && sleep 0'
fatal: [127.0.0.1]: FAILED! => {
    "changed": false,
    "cmd": [
        "/usr/bin/python3.6",
        "-m",
        "venv",
        "-p/home/REDACTED/test/venv/bin/python3.6",
        "/test_venv"
    ],
    "invocation": {
        "module_args": {
            "chdir": null,
            "editable": false,
            "executable": null,
            "extra_args": null,
            "name": [
                "pip==21.1.2"
            ],
            "requirements": null,
            "state": "present",
            "umask": null,
            "version": null,
            "virtualenv": "/test_venv",
            "virtualenv_command": "/usr/bin/python3.6 -m 'venv'",
            "virtualenv_python": null,
            "virtualenv_site_packages": false
        }
    },
    "msg": "\n:stderr: usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]\n            [--upgrade] [--without-pip] [--prompt PROMPT]\n            ENV_DIR [ENV_DIR ...]\nvenv: error: unrecognized arguments: -p/home/REDACTED/test/venv/bin/python3.6\n"
}

PLAY RECAP ********************************************************************************************************************************************************************************************************************************************************************
127.0.0.1                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
tmp = []
    for one_line in names:
        tmp.extend(one_line.split(","))
    names = tmp
    
    name_parts = []
    package_names = []
    in_brackets = False
    for name in names:
        if _is_package_name(name) and not in_brackets:
            if name_parts:
                package_names.append(",".join(name_parts))
            name_parts = []
        if "[" in name:
            in_brackets = True
        if in_brackets and "]" in name:
            in_brackets = False
        name_parts.append(name)
    package_names.append(",".join(name_parts))
    return package_names
def _get_cmd_options(module, cmd):
    thiscmd = cmd + " --help"
    rc, stdout, stderr = module.run_command(thiscmd)
    if rc != 0:
        module.fail_json(msg="Could not get output from %s: %s" % (thiscmd, stdout + stderr))
    words = stdout.strip().split()
    cmd_options = [x for x in words if x.startswith('--')]
    return cmd_options
def _get_packages(module, pip, chdir):