pip成功安装了包,但在命令行中找不到可执行文件。

288

我正在使用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中调用包完全正常,但是在命令行上无法找到可执行文件。


1
有任何虚拟环境涉及吗? - JL Peyret
不,没有涉及到virtualenv。 - Sanket_Diwale
当你使用sudo命令时,你会切换到root用户的$PATH路径,只需确保他的PATH已更新,而不是你的PATH。 - DevLounge
13个回答

157

我知道这个问题是关于 macOS 的,但是这里有一个针对 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 issue了解更多细节:https://github.com/pypa/pip/issues/3813 要修复这个问题,只需将~/.local/bin添加到$PATH中即可。例如,可以将以下行添加到您的.bashrc文件中:
export PATH="$HOME/.local/bin:$PATH"

之后,请重新启动您的shell,然后一切都应该正常工作。


127

解决方法

参考其他答案,在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以运行新更改,这样就可以得到在开头提到的建议解决方案。


不知道为什么我的路径是错误的,但是 Python 二进制文件是从 MacPorts 使用的..? $ python3 -m site --user-base /Users/macpro/Library/Python/3.11 $ which python3 /opt/local/bin/python3 - holms
非常完美,非常感谢你! - undefined
我会将以下内容添加到您的运行命令文件中,这样每次更新Python时它都会自动更新:export PATH="$(python3 -m site --user-base)/bin:$PATH" - undefined

90

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


73
检查你的$PATH tox有一个命令行模式:
audrey:tests jluc$ pip list | grep tox
tox (2.3.1)

它在哪里?

(编辑:这里 2.7 的内容并不重要,用任何 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 中的东西来自何处,请尝试执行此操作(将tox替换为rosdep)。

$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目录?您是否在该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

63

解决方案

将以下内容添加到您的.bashrc.zshrc或等效的shellrc文件中:

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

如果你需要Python 2,也要加上这个:
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

更多信息

如果您使用--user进行安装(例如pip3.6 install --user tmuxp),可以通过Python的site模块获取特定平台的用户安装目录。例如,在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.11 -m site &> /dev/null && PATH="$PATH:`python3.11 -m site --user-base`/bin"
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

为什么要使用精确的版本号(3.11)而不只是主版本号(3)?

我使用精确的Python版本号来减少在Python升级次要版本时可执行文件"消失"的机会,例如从3.5升级到3.6。它们会消失,因为如上所述,用户安装路径可能包含Python版本号。因此,尽管python3可以指向3.5、3.6、3.11等等,但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"

24
在python.org的安装包教程中,描述了如何找到二进制目录:
在Windows上:
你可以通过运行`python -m site --user-site`并将`site-packages`替换为`Scripts`来找到用户基础二进制目录。例如,这可能返回`C:\Users\Username\AppData\Roaming\Python36\site-packages`,所以你需要将你的PATH设置为包括`C:\Users\Username\AppData\Roaming\Python36\Scripts`。
在Linux和macOS上:
在Linux和macOS上,你可以通过运行`python -m site --user-base`并在末尾添加`bin`来找到用户基础二进制目录。例如,这通常会打印`~/.local`(`~`会被扩展为你的家目录的绝对路径),所以你需要将`~/.local/bin`添加到你的PATH中。

"python -m site --user-site并将site-packages替换为Scripts"就是这样,这是有效的。 - undefined

8

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

在我的情况下,问题是我没有在setup.py文件中设置entry_point:

entry_points = {'console_scripts':

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

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

这个目录在我的(Windows)机器上不存在。 - Paul Wintz

6

我解决了问题!

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

现在,MacOS已经将默认终端从bash转换为zsh。因此,您需要使用zshrc而不是bashrc或bash_profile。

  1. foobaz -v

运行命令“foobaz -v”以获取版本信息。


5

从Microsoft Store安装Windows和Python 3.9

我用python -m site --user-basepython -m site两种方法得到的路径不同。其他答案也有提到,要使用第二个命令并去掉--user-base参数才能获得所有路径:

C:\Users\<你的用户名>\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages

为什么我的路径不同?

这是因为我是从Microsoft Store安装的python

解决方案

将上述路径添加到你的环境变量中,并将site-packages替换为scripts


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接