Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pip bin to support ansible pip module installation #1334

Open
xiaoyao9184 opened this issue Apr 9, 2024 · 3 comments
Open

Add pip bin to support ansible pip module installation #1334

xiaoyao9184 opened this issue Apr 9, 2024 · 3 comments
Labels
enhancement New feature or request

Comments

@xiaoyao9184
Copy link

How would this feature be useful?

I'm using ansible to inject new dependencies for package in pipx,
for example installing jmespath for pipx ansible-core

I've noticed that the venv created by pipx is different and uses shared for pip,
so there is no pip command in bin path

shared bin path

ls -l /usr/local/py-utils/shared/bin/
total 48
-rw-r--r-- 1 root pipx 1903 Mar 30 09:08 activate
-rw-r--r-- 1 root pipx  852 Mar 30 09:08 activate.csh
-rw-r--r-- 1 root pipx 1992 Mar 30 09:08 activate.fish
-rw-r--r-- 1 root pipx 8834 Mar 30 09:08 Activate.ps1
-rwxrwxr-x 1 root pipx  252 Mar 30 09:08 easy_install
-rwxrwxr-x 1 root pipx  252 Mar 30 09:08 easy_install-3.9
-rwxrwxr-x 1 root pipx  242 Mar 30 09:08 pip
-rwxrwxr-x 1 root pipx  242 Mar 30 09:08 pip3
-rwxrwxr-x 1 root pipx  242 Mar 30 09:08 pip3.10
-rwxrwxr-x 1 root pipx  242 Mar 30 09:08 pip3.9
lrwxrwxrwx 1 root pipx    7 Mar 30 09:08 python -> python3
lrwxrwxrwx 1 root pipx   16 Mar 30 09:08 python3 -> /usr/bin/python3
lrwxrwxrwx 1 root pipx    7 Mar 30 09:08 python3.9 -> python3

env ansible-core bin path

ls -l /usr/local/py-utils/venvs/ansible-core/bin
total 80
-rw-r--r-- 1 root   pipx 1921 Mar 30 09:08 activate
-rw-r--r-- 1 root   pipx  870 Mar 30 09:08 activate.csh
-rw-r--r-- 1 root   pipx 2010 Mar 30 09:08 activate.fish
-rw-r--r-- 1 root   pipx 8834 Mar 30 09:08 Activate.ps1
-rwxrwxr-x 1 root   pipx  249 Mar 30 09:08 ansible
-rwxrwxr-x 1 root   pipx  269 Mar 30 09:09 ansible-community
-rwxrwxr-x 1 root   pipx  250 Mar 30 09:08 ansible-config
-rwxrwxr-x 1 root   pipx  279 Mar 30 09:08 ansible-connection
-rwxrwxr-x 1 root   pipx  251 Mar 30 09:08 ansible-console
-rwxrwxr-x 1 root   pipx  247 Mar 30 09:08 ansible-doc
-rwxrwxr-x 1 root   pipx  250 Mar 30 09:08 ansible-galaxy
-rwxrwxr-x 1 root   pipx  253 Mar 30 09:08 ansible-inventory
-rwxrwxr-x 1 root   pipx  252 Mar 30 09:08 ansible-playbook
-rwxrwxr-x 1 root   pipx  248 Mar 30 09:08 ansible-pull
-rwxrwxr-x 1 root   pipx 1733 Mar 30 09:08 ansible-test
-rwxrwxr-x 1 root   pipx  249 Mar 30 09:08 ansible-vault
-rwxr-xr-x 1 vscode pipx 1728 Apr  9 01:43 jp.py
drwxr-sr-x 2 vscode pipx 4096 Apr  9 01:43 __pycache__
lrwxrwxrwx 1 root   pipx    7 Mar 30 09:08 python -> python3
lrwxrwxrwx 1 root   pipx   16 Mar 30 09:08 python3 -> /usr/bin/python3
lrwxrwxrwx 1 root   pipx    7 Mar 30 09:08 python3.9 -> python3

Describe the solution you'd like

This is a problem for the ansible.builtin.pip module,
as it can't use calls like 'python -m pip', but only the pip command,
Maybe add a soft link to pip command for pipx venv to reach compatibility?

Here's an ansible example

    - name: case1 create venv and install jmespath
      ansible.builtin.pip:
        name: jmespath
        virtualenv: /usr/local/py-utils/venvs/test1
        virtualenv_command: /usr/local/py-utils/venvs/pipx/bin/python -m venv

    - name: case2 install jmespath with existing venv created by pipx
      ansible.builtin.pip:
        name: jmespath
        virtualenv: /usr/local/py-utils/venvs/ansible-core
        virtualenv_command: /usr/local/py-utils/venvs/pipx/bin/python -m venv
      ignore_errors: yes

    - name: ansible cant support python -m pip
      ansible.builtin.pip:
        name: jmespath
        executable: /usr/local/py-utils/venvs/ansible-core/bin/python -m pip
      ignore_errors: yes

output

TASK [Gathering Facts] *****************************************************************************************************************************************************************************************
ok: [localhost]

TASK [case1 create venv and install jmespath] ******************************************************************************************************************************************************************
ok: [localhost]

TASK [case2 install jmespath with existing venv created by pipx] ***********************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Unable to find pip in the virtualenv, /usr/local/py-utils/venvs/ansible-core, under any of these names: pip3, pip. Make sure pip is present in the virtualenv."}
...ignoring

TASK [ansible cant support python -m pip] **********************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "'/usr/local/py-utils/venvs/ansible-core/bin/python -m pip' install jmespath", "msg": "[Errno 2] No such file or directory: b'/usr/local/py-utils/venvs/ansible-core/bin/python -m pip'", "rc": 2, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

case1 test1 success, case2 ansible-core fail, because test1 added the pip command.

$ . /usr/local/py-utils/venvs/test1/bin/activate
(test1) $ which pip
/usr/local/py-utils/venvs/test1/bin/pip

Describe alternatives you've considered

Currently I'm using a bash wrapper script that will emulate the python -m pip command, not sure if there are any other issues with that.

    - name: create pip wrapper script
      become: true
      ansible.builtin.copy:
        dest: /usr/local/py-utils/venvs/ansible-core/bin/pip
        owner: root
        group: pipx
        mode: u+rwx,g+rwx,o+rx
        content: |
          #!/bin/bash

          exec /usr/local/py-utils/venvs/ansible-core/bin/python -m pip $@

    - name: install jmespath with existing venv created by pipx
      ansible.builtin.pip:
        name: jmespath
        virtualenv: /usr/local/py-utils/venvs/ansible-core
        virtualenv_command: /usr/local/py-utils/venvs/pipx/bin/python -m venv
@uranusjr
Copy link
Member

uranusjr commented Apr 9, 2024

Maybe we should add a special case (say pipx inject ansible pip) for this.

@chrysle chrysle added the enhancement New feature or request label Apr 9, 2024
@xiaoyao9184
Copy link
Author

looks great

@huxuan
Copy link
Contributor

huxuan commented Apr 23, 2024

Just double confirm about the enhancement here, maybe we should add an option --with-pip for venv creation related command?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants