pip installs packages successfully, but executables not found from command line

后端 未结 9 2450
感情败类
感情败类 2020-12-07 13:44

I am working on mac OS X Yosemite, version 10.10.3.

I installed python2.7 and pip using macport as done in http://johnlaudun.org/20150512-installing-and-setting-pip

相关标签:
9条回答
  • 2020-12-07 13:59

    In addition to adding python's bin directory to $PATH variable, I also had to change the owner of that directory, to make it work. No idea why I wasn't the owner already.

    chown -R ~/Library/Python/
    
    0 讨论(0)
  • 2020-12-07 14:04

    If you're installing using --user (e.g. pip3.6 install --user tmuxp), it is possible to get the platform-specific user install directory from Python itself using the site module. For example, on macOS:

    $ python2.7 -m site --user-base
    /Users/alexp/Library/Python/2.7
    

    By appending /bin to this, we now have the path where package executables will be installed. We can dynamically populate the PATH in your shell's rc file based on the output; I'm using bash, but with any luck this is portable:

    # Add Python bin directories to path
    python3.6 -m site &> /dev/null && PATH="$PATH:`python3.6 -m site --user-base`/bin"
    python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"
    

    I use the precise Python versions to reduce the chance of the executables just "disappearing" when Python upgrades a minor version, e.g. from 3.5 to 3.6. They'll disappear because, as can be seen above, the user installation path may include the Python version. So while python3 could point to 3.5 or 3.6, python3.6 will always point to 3.6. This needs to be kept in mind when installing further packages, e.g. use pip3.6 over pip3.

    If you don't mind the idea of packages disappearing, you can use python2 and python3 instead:

    # Add Python bin directories to path
    # Note: When Python is upgraded, packages may need to be re-installed
    #       or Python versions managed.
    python3 -m site &> /dev/null && PATH="$PATH:`python3 -m site --user-base`/bin"
    python2 -m site &> /dev/null && PATH="$PATH:`python2 -m site --user-base`/bin"
    
    0 讨论(0)
  • 2020-12-07 14:06

    I know the question asks about macOS, but here is a solution for Linux users who arrive here via Google.

    I was having the issue described in this question, having installed the pdfx package via pip.

    When I ran it however, nothing...

    pip list | grep pdfx
    pdfx (1.3.0)
    

    Yet:

    which pdfx
    pdfx not found
    

    The problem on Linux is that pip install ... drops scripts into ~/.local/bin and this is not on the default Debian/Ubuntu $PATH.

    Here's a GitHub issue going into more detail: https://github.com/pypa/pip/issues/3813

    To fix, just add ~/.local/bin to your $PATH, for example by adding the following line to your .bashrc file:

    export PATH="$HOME/.local/bin:$PATH"
    

    After that, restart your shell and things should work as expected.

    0 讨论(0)
  • 2020-12-07 14:08

    check your $PATH

    tox has a command line mode:

    audrey:tests jluc$ pip list | grep tox
    tox (2.3.1)
    

    where is it?

    (edit: the 2.7 stuff doesn't matter much here, sub in any 3.x and pip's behaving pretty much the same way)

    audrey:tests jluc$ which tox
    /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/tox
    

    and what's in my $PATH?

    audrey:tests jluc$ echo $PATH
    /opt/chefdk/bin:/opt/chefdk/embedded/bin:/opt/local/bin:..../opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin...
    

    Notice the /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin? That's what allows finding my pip-installed stuff

    Now, to see where things are from Python, try doing this (substitute rosdep for tox).

    $python
    >>> import tox
    >>> tox.__file__
    

    that prints out:

    '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tox/__init__.pyc'
    

    Now, cd to the directory right above lib in the above. Do you see a bin directory? Do you see rosdep in that bin? If so try adding the bin to your $PATH.

    audrey:2.7 jluc$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7
    audrey:2.7 jluc$ ls -1
    

    output:

    Headers
    Python
    Resources
    bin
    include
    lib
    man
    share
    
    0 讨论(0)
  • 2020-12-07 14:08

    On macOS with the default python installation you need to add /Users/<you>/Library/Python/2.7/bin/ to your $PATH.

    Add this to your .bash_profile:

    export PATH="/Users/<you>/Library/Python/2.7/bin:$PATH"
    

    That's where pip installs the executables.

    Tip: For non-default python version which python to find the location of your python installation and replace that portion in the path above. (Thanks for the hint Sanket_Diwale)

    0 讨论(0)
  • 2020-12-07 14:14

    Solution

    Based on other answers, for linux and mac you can run the following:

    echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
    source ~/.bashrc
    

    instead of python3 you can use any other link to python version: python, python2.7, python3.6, python3.9, etc.

    Explanation

    In order to know where the user packages are installed in the current OS (win, mac, linux), we run:

    python3 -m site --user-base
    

    We know that the scripts go to the bin/ folder where the packages are installed.

    So we concatenate the paths:

    echo `python3 -m site --user-base`/bin
    

    Then we export that to an environment variable.

    export PATH=\"`python3 -m site --user-base`/bin:$PATH\"
    

    Finally, in order to avoid repeating the export command we add it to our .bashrc file and we run source to run the new changes, giving us the suggested solution mentioned at the beginning.

    0 讨论(0)
提交回复
热议问题