【问题标题】:pip installs packages successfully, but executables not found from command linepip 成功安装软件包,但从命令行找不到可执行文件
【发布时间】:2016-06-24 05:59:11
【问题描述】:

我正在开发 Mac OS X Yosemite,版本 10.10.3。

我使用 macport 安装了 python2.7 和 pip,就像在 http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

我可以成功安装包并将它们导入到我的 python 环境和 python 脚本中。但是,找不到与可以从终端命令行调用的包关联的任何可执行文件。

有谁知道可能出了什么问题?(下面有更多详细信息)

例如,在按照http://wiki.ros.org/jade/Installation/Source 中的说明安装名为“rosdep”的软件包时

我可以跑:sudo pip install -U rosdep 安装无误,对应文件位于/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

但是,如果我尝试运行:sudo rosdep init, 它给出了一个错误:"sudo: rosdep: command not found"

这不是特定于软件包的错误。对于在我的计算机上使用 pip 安装的任何软件包,我都会得到这个。我什至尝试添加

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

致我的$PATH。 但是在命令行上找不到可执行文件,即使这些包在 python 中完美运行。

【问题讨论】:

  • 是否涉及任何 virtualenv?
  • 不,不涉及 virtualenv。
  • 当你 sudo 时,你切换到 root 用户的 $PATH,只要确保他的 PATH 被更新,而不是你的 PATH

标签: python macos pip macports


【解决方案1】:

解决方案

根据其他答案,对于linuxmac,您可以运行以下命令:

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

除了python3,您还可以使用任何其他指向python版本的链接:pythonpython2.7python3.6python3.9等。

从你最喜欢的 shell 中选择 rc 文件,而不是 .bashrc。

说明

为了知道用户包在当前操作系统(win、mac、linux)中的安装位置,我们运行:

python3 -m site --user-base

我们知道脚本会转到安装软件包的bin/ 文件夹。

所以我们连接路径:

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

然后我们将其导出到环境变量中。

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

最后,为了避免重复导出命令,我们将它添加到我们的.bashrc 文件中并运行source 来运行新的更改,从而为我们提供了开头提到的建议解决方案。

【讨论】:

  • @Benjamints 添加了解释,希望对您有所帮助,祝您好运!
  • 最后一条命令中有很多引用。试图编辑它,但我必须更改至少 6 个字符才能保存它。
  • 回显将扩展完整的路径,因为命令中的$PATH!将完整的 PATH 放在 bashrc 中并不常见...您需要转义 $ 符号!!
【解决方案2】:

来自 MS Store 的 Windows 和 Python 3.9

我与python -m site --user-basepython -m site 有不同的路径-是的,没有--user-base 的第二个命令获取所有站点-正如此处的其他答案所述:

C:\Users\<your User>\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages

为什么我的路径不同

因为我从 MS Store 安装了python

解决方案

把上面的路径放到你的路径中,把site-packages替换成scripts

【讨论】:

    【解决方案3】:

    在 Windows 上,这对我有帮助 https://packaging.python.org/tutorials/installing-packages

    在 Windows 上,您可以通过运行 python -m site --user-site 并将 site-packages 替换为脚本来找到用户基础二进制目录。例如,这可能会返回 C:\Users\Username\AppData\Roaming\Python36\site-packages,因此您需要将 PATH 设置为包含 C:\Users\Username\AppData\Roaming\Python36\Scripts。您可以在控制面板中永久设置您的用户路径。您可能需要注销才能使 PATH 更改生效。

    【讨论】:

    • 我的是 'C:\Users\felip\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\Scripts\'。说真的,wtf?
    【解决方案4】:

    当您使用 MacOS 安装程序(从 Python 网站下载)安装 Python 或 Python3 时 - 它会在您的 ~/.profile 脚本中添加一个 exporter。您需要做的只是source 它。重新启动所有终端也应该可以解决问题。

    警告 - 我认为最好只将 pip3 与 Python3 一起使用 - 为了将来的利益。

    如果您已经安装了 Python3,以下步骤适用于 macOS Mojave:

    1. 首先使用sudo - sudo -H pip3 install ansible安装ansible

    2. 您创建一个指向 Python 的 bin 路径的符号链接

    sudo ln -s /Library/Frameworks/Python.framework/Versions/Current/bin /Library/Frameworks/Python.framework/current_python_bin

    并将其装订到.profile

    export PATH=$PATH:/Library/Frameworks/Python.framework/current_python_bin

    1. 运行 source ~/.profile 并重新启动所有终端 shell。

    2. 输入ansible --version

    【讨论】:

    • 在使用 pip3 安装 cmdline python 包后为您的开场白 +1(只需重新运行 .profile 或注销并重新登录)。
    【解决方案5】:

    检查你的 $PATH

    tox有命令行模式:

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

    它在哪里?

    (编辑:2.7 的东西在这里无关紧要,在任何 3.x 中的 sub 和 pip 的行为方式几乎相同)

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

    我的 $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...
    

    注意到 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin 了吗?这就是允许找到我的 pip 安装的东西的原因

    现在,要查看来自 Python 的内容,请尝试执行此操作(将 rosdep 替换为 tox)。

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

    打印出来的:

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

    现在,cd 到上面lib 正上方的目录。你看到 bin 目录了吗?你在那个垃圾箱里看到rosdep了吗?如果是这样,请尝试将 bin 添加到您的 $PATH。

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

    输出:

    Headers
    Python
    Resources
    bin
    include
    lib
    man
    share
    

    【讨论】:

    • 感谢 JL 的回答,但这主要是我的问题。对于我的示例应用程序 rosdep,当我按照您的方式进行操作时,获得的输出如下: pip list | grep rosdep rosdep (0.11.4) which rosdep(无输出),命令行不返回任何东西
    • which 不返回 rosdep 与您的问题一致。我的意思是,您需要找到 rosdep 的安装位置以及 $PATH 的样子。
    • 谢谢,我的二进制文件也安装在 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin 中。将其添加到 PATH 中,现在它可以工作了。谢谢,我无法找到二进制文件,因为它没有提供任何输出。
    • 如果您找不到带有which 的程序(如果它不在您的路径中),您也可以尝试在Linux 上使用mlocate 或在macOS 上使用mdfind 查找二进制文件.
    • 是的,我很抱歉,但这完全是……很奇怪(?)……建议使用“which”,因为只有当二进制文件实际上是 CAN 时才会给出正确的答案成立。 OP 的问题(以及大多数来这里的人)不是这种情况。
    【解决方案6】:

    我知道这个问题是关于 macOS 的,但这里是为通过 Google 到达这里的 Linux 用户提供的解决方案。

    我遇到了这个问题中描述的问题,通过 pip 安装了 pdfx 包。

    然而,当我运行它时,什么都没有......

    pip list | grep pdfx
    pdfx (1.3.0)
    

    还是:

    which pdfx
    pdfx not found
    

    Linux 上的问题是pip install ... 将脚本放入~/.local/bin,而这不在默认的Debian/Ubuntu $PATH 中。

    这里有一个更详细的 GitHub 问题:https://github.com/pypa/pip/issues/3813

    要解决此问题,只需将~/.local/bin 添加到您的$PATH,例如将以下行添加到您的.bashrc 文件中:

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

    之后,重新启动你的 shell,一切都会按预期工作。

    【讨论】:

    • 你可以source ~/.bashrc重新加载.bashrc配置而不是重新启动你的shell
    • 太棒了。我收到“找不到毒药命令”。更新 PATH 后它可以工作
    • @chovy 你是重启了shell还是调用了exec bash?
    • 所以我遇到了这个确切的问题,我正在使用启动脚本开发云计算引擎,该脚本可以执行很多操作以及安装 pip。所以发生的事情是 pip list 给了我库和版本,但是,哪个命令什么也没给我。我有点困惑,我应该在我的启动脚本中将 export PATH="$HOME/.local/bin:$PATH" 命令放在哪里才能使其工作?
    • 我遇到了同样的问题,但二进制文件甚至没有安装在 /home/USER/.local/bin 中。顺便说一句:它之前安装在那里,我只是尝试在升级之前手动更新和删除它。
    【解决方案7】:

    除了将 python 的bin 目录添加到$PATH 变量之外,我还必须更改该目录的所有者才能使其正常工作。不知道为什么我已经不是所有者了。

    chown -R ~/Library/Python/
    

    【讨论】:

      【解决方案8】:

      在 Windows 上,您需要将路径 %USERPROFILE%\AppData\Roaming\Python\Scripts 添加到您的路径中。

      【讨论】:

        【解决方案9】:

        在默认安装 python 的 macOS 上,您需要将 /Users/<you>/Library/Python/2.7/bin/ 添加到 $PATH。

        将此添加到您的 .bash_profile:

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

        这就是 pip 安装可执行文件的地方。

        提示:对于非默认 python 版本which python,找到你的 python 安装位置并替换上面路径中的那部分。 (感谢 Sanket_Diwale 的提示)

        【讨论】:

        • pip 的安装位置取决于你如何安装python,MacOS 有多种安装python 的方式,如macports、homebrew 和系统默认。根据使用的 python 版本,您将有不同的 pip 位置。找出 pip 和 python 所在位置的一种简单方法是在终端中使用“which python”,然后将适当的位置添加到 $PATH。
        • 对于从 python.org 安装 Python 3.6 的 macOS 10.14.3,which python3 最终(通过链接)引导我到 /Library/Frameworks/Python.framework/Versions/3.6/bin/
        • 这个答案在 Ubuntu 18 上帮助了我。我只是在终端上运行 export PATH=$HOME/.local/bin:$PATH 因为我不想永久更改 $PATH
        【解决方案10】:

        我偶然发现了这个问题,因为我创建、成功构建并发布了一个 PyPI 包,但在安装后无法执行。 $PATH变量设置正确。

        就我而言,问题是我没有在setup.py 文件中设置entry_point

        entry_points = {'console_scripts':
        
        ['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},
        

        【讨论】:

          【解决方案11】:

          如果您使用--user(例如pip3.6 install --user tmuxp)安装,it is possible to get the platform-specific user install directory from Python itself using the site module。例如,在 macOS 上:

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

          通过将/bin 附加到此,我们现在有了安装包可执行文件的路径。我们可以根据输出动态地在你的 shell 的 rc 文件中填充 PATH;我正在使用 bash,但幸运的是,这是可移植的:

          # 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"
          

          我使用精确的 Python 版本来减少当 Python 升级次要版本时可执行文件“消失”的机会,例如从 3.5 到 3.6。它们会消失,因为如上所示,用户安装路径可能包含 Python 版本。因此,虽然python3 可以指向 3.5 或 3.6,但python3.6 将始终指向 3.6。在安装其他软件包时需要牢记这一点,例如使用pip3.6 而不是pip3

          如果您不介意包消失的想法,您可以改用python2python3

          # 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"
          

          【讨论】:

          • 上帝保佑你的灵魂!!!谢谢。这应该是公认的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          • 1970-01-01
          • 2019-12-18
          • 1970-01-01
          • 2021-06-22
          • 1970-01-01
          • 2015-08-07
          相关资源
          最近更新 更多