pip 成功安装包,但未从命令行找到可执行文件

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

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

我安装了 python2.7 并使用 mac 端口安装了 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.

中工作得很好

检查你的 $PATH

tox 有一个命令行模式:

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

它在哪里?

(编辑:2.7 的东西在这里并不重要,sub in any 3.x 和 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

在默认 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)

如果您使用 --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 版本来减少 "disappearing" 当 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"

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

在我的例子中,问题是我没有在 setup.py 文件中设置 entry_point

entry_points = {'console_scripts':

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

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

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

chown -R ~/Library/Python/

我知道这个问题是关于 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,事情应该会按预期进行。

解决方案

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

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

而不是 python3 您可以使用任何其他 link 到 python 版本:pythonpython2.7python3.6python3.9,等等

而不是 .bashrc,选择您喜欢的 rc 文件 shell。

说明

为了知道当前OS(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 到 运行 新的更改,给我们开头提到的建议解决方案。

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

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

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

  1. 首先使用 sudo 安装 ansible - sudo -H pip3 install 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

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

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

Windows 和 Python 来自 MS Store 的 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

macOS Monterey 也有同样的问题。我不得不修改我的 .bash_profile 文件并添加以下条目

export PATH="~/Library/Python/3.8/bin:$PATH"

macOS Monterey 上的默认 python 版本是 3.8,但您必须仔细检查 python 版本以确保您使用的是正确的版本

我解决问题了!

  1. 使用 pip3 代替 pip
  2. pip3 install foobaz
  3. vim ~/.zshrc 并添加:
export PATH="/Users/your_name/Library/Python/3.8/bin:$PATH"
  1. source ~/.zshrc

Now MacOS has shifted the default terminal from bash to zsh. Therefore, you have to source zshrc but not bashrc or bash_profile.

  1. foobaz -v