### Summary

ansible-playbook with --connection-password-file or --become-password-file  options fails  with error:

 File "venv/lib/python3.8/site-packages/ansible/cli/__init__.py", line 516, in get_password_from_file
    elif os.path.is_executable(b_pwd_file):
AttributeError: module 'posixpath' has no attribute 'is_executable'


### Issue Type

Bug Report

### Component Name

https://github.com/ansible/ansible/blob/devel/lib/ansible/cli/__init__.py#L543

### Ansible Version

```console
ansible [core 2.12.1]
  config file = ***/ansible/ansible.cfg
  configured module search path = ['.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = ***/ansible/venv/lib/python3.8/site-packages/ansible
  ansible collection location = .ansible/collections:/usr/share/ansible/collections
  executable location = ***/ansible/venv/bin/ansible
  python version = 3.8.6 (default, Nov 20 2020, 18:02:11) [Clang 11.0.0 (clang-1100.0.33.17)]
  jinja version = 2.11.1
  libyaml = False
```


### Configuration

```console
HOST_KEY_CHECKING=False
```


### OS / Environment

Mac OS 11.6.1

### Steps to Reproduce

1. Implement simple playbook ping.yml:
````yaml
- hosts: all
  become: true
  tasks:
  - ping
````
2. Run command ````ansible-playbook -i hosts ping.yml --connection-password-file file````
3. Error occurs

### Expected Results

I expect ansible-playbook command to load password from file.

### Actual Results

```console
ERROR! Unexpected Exception, this is probably a bug: module 'posixpath' has no attribute 'is_executable'
the full traceback was:

Traceback (most recent call last):
  File "***/ansible/venv/bin/ansible-playbook", line 128, in <module>
    exit_code = cli.run()
  File "***/ansible/venv/lib/python3.8/site-packages/ansible/cli/playbook.py", line 114, in run
    (sshpass, becomepass) = self.ask_passwords()
  File "***/ansible/venv/lib/python3.8/site-packages/ansible/cli/__init__.py", line 257, in ask_passwords
    sshpass = CLI.get_password_from_file(op['connection_password_file'])
  File "***/ansible/venv/lib/python3.8/site-packages/ansible/cli/__init__.py", line 516, in get_password_from_file
    elif os.path.is_executable(b_pwd_file):
AttributeError: module 'posixpath' has no attribute 'is_executable'
(venv) ➜  ansible git:(PML-4558-lv-qa-prod-ansible) ✗ ansible --version
ansible [core 2.12.1]
  config file = ***/ansible/ansible.cfg
  configured module search path = ['***/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = ***/ansible/venv/lib/python3.8/site-packages/ansible
  ansible collection location = ***/.ansible/collections:/usr/share/ansible/collections
  executable location = ***/ansible/venv/bin/ansible
  python version = 3.8.6 (default, Nov 20 2020, 18:02:11) [Clang 11.0.0 (clang-1100.0.33.17)]
  jinja version = 2.11.1
  libyaml = False
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
"""
        Create an options parser for most ansible scripts
        Subclasses need to implement this method.  They will usually call the base class's
        init_parser to create a basic version and then add their own options on top of that.
        An implementation will look something like this::
            def init_parser(self):
                super(MyCLI, self).init_parser(usage="My Ansible CLI", inventory_opts=True)
                ansible.arguments.option_helpers.add_runas_options(self.parser)
                self.parser.add_option('--my-option', dest='my_option', action='store')
        """
        self.parser = opt_help.create_base_parser(self.name, usage=usage, desc=desc, epilog=epilog)
    @abstractmethod
    def post_process_args(self, options):
        """Process the command line args
        Subclasses need to implement this method.  This method validates and transforms the command
        line arguments.  It can be used to check whether conflicting values were given, whether filenames
        exist, etc.
        An implementation will look something like this::
            def post_process_args(self, options):
                options = super(MyCLI, self).post_process_args(options)
                if options.addition and options.subtraction:
                    raise AnsibleOptionsError('Only one of --addition and --subtraction can be specified')
                if isinstance(options.listofhosts, string_types):
                    options.listofhosts = string_types.split(',')
                return options
        """
        
        if hasattr(options, 'tags') and not options.tags: