ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 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

C
Community

我知道这个问题是关于 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
伟大的。我得到“找不到tox命令”。更新 PATH 后它可以工作
@chovy您是否重新启动了外壳程序或调用了 exec bash?
所以我有这个确切的问题,我正在使用启动脚本来开发云计算引擎,该脚本可以完成很多事情以及 pip 安装。所以发生的事情是 pip list 给了我库和版本,但是,哪个命令什么也没给我。我有点困惑,我应该在我的启动脚本中将 export PATH="$HOME/.local/bin:$PATH" 命令放在哪里才能使其工作?
我遇到了同样的问题,但二进制文件甚至没有安装在 /home/USER/.local/bin 中。顺便说一句:它之前安装在那里,我只是尝试在升级之前手动更新和删除它。
j
joh-mue

在具有默认 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
如果是自制软件,我在 /opt/homebrew/bin/ 下找到了 pip3 安装的二进制文件。我花了一段时间,因为我试图在 /opt/homebrew/lib/python3.9/ 下找到它,但只找到了站点包。
J
JL Peyret

检查你的 $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 (no output), 命令行不返回任何东西
which 不返回 rosdep 与您的问题一致。我的意思是您需要找到 rosdep 的安装位置以及 $PATH 的样子。
谢谢,我的二进制文件也安装在 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin 中。将其添加到 PATH 中,现在它可以工作了。谢谢,我无法找到二进制文件,因为它没有提供任何输出。
如果您找不到带有 which 的程序(如果它不在您的路径中),您也可以尝试在 linux 上使用 mlocate 或在 macOS 上使用 mdfind 来查找二进制文件。
是的,我很抱歉,但这完全是……奇怪(?)……建议使用“which”,因为只有在实际可以找到二进制文件的情况下,它才会给出正确的答案。 OP 的问题(以及大多数来到这里的人)不是这种情况。
W
Willemoes

解决方案

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

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

您可以使用任何其他指向 python 版本的链接来代替 python3pythonpython2.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!将完整的 PATH 放在 bashrc 中并不常见...您需要转义 $ 符号!
A
Alex Palmer

如果您使用 --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"

上帝保佑你的灵魂!!!谢谢你。这应该是公认的答案。
G
Git.Coach

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

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

entry_points = {'console_scripts':

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

z
zb226

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


N
Narendra Rana

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

在 Windows 上,您可以通过运行 python -m site --user-site 并用脚本替换站点包来找到用户基础二进制目录。例如,这可能返回 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?
T
Timo

来自 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


D
Dharman

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

警告 - 我相信最好将 pip3 与 Python3 一起使用 - 以获得未来的利益。

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

首先使用 sudo 安装 ansible - sudo -H pip3 install ansible 你创建一个指向 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

运行 source ~/.profile 并重新启动所有终端 shell。键入 ansible --version


在使用 pip3 安装 cmdline python 包后,为您的开场陈述 +1(只需重新运行 .profile 或注销并重新登录)。
d
d4Rk

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

chown -R ~/Library/Python/

D
Diego Velez

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

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

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


P
Pandy

我解决问题!

使用 pip3 代替 pip。 pip3 install foobaz vim ~/.zshrc 并添加:

export PATH="/Users/your_name/Library/Python/3.8/bin:$PATH"

源〜/ .zshrc

现在 MacOS 已将默认终端从 bash 转移到 zsh。因此,您必须 source zshrc 而不是 bashrc 或 bash_profile。

foobaz -v