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
.
如果您不介意包消失的想法,您可以使用 python2
和 python3
代替:
# 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,事情应该会按预期进行。
解决方案
根据其他答案,对于 linux
和 mac
您可以 运行 以下内容:
echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc
而不是 python3
您可以使用任何其他 link 到 python 版本:python
、python2.7
、python3.6
、python3.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
添加一个 export
er脚本。您需要做的只是 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
在 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-base
和 python -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 版本以确保您使用的是正确的版本
我解决问题了!
- 使用
pip3
代替 pip
。
pip3 install foobaz
vim ~/.zshrc
并添加:
export PATH="/Users/your_name/Library/Python/3.8/bin:$PATH"
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.
foobaz -v
我正在开发 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
.
如果您不介意包消失的想法,您可以使用 python2
和 python3
代替:
# 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,事情应该会按预期进行。
解决方案
根据其他答案,对于 linux
和 mac
您可以 运行 以下内容:
echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc
而不是 python3
您可以使用任何其他 link 到 python 版本:python
、python2.7
、python3.6
、python3.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
添加一个 export
er脚本。您需要做的只是 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
在 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-base
和 python -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 版本以确保您使用的是正确的版本
我解决问题了!
- 使用
pip3
代替pip
。 pip3 install foobaz
vim ~/.zshrc
并添加:
export PATH="/Users/your_name/Library/Python/3.8/bin:$PATH"
source ~/.zshrc
Now MacOS has shifted the default terminal from
bash
tozsh
. Therefore, you have to source zshrc but not bashrc or bash_profile.
foobaz -v