关于python:pip成功安装软件包,但在命令行中找不到可执行文件

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

我正在使用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安装的所有软件包,我都会得到它。我什至尝试添加

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

到我的$PATH
但是,即使软件包在python内完美运行,也无法在命令行上找到可执行文件。


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

将此添加到您的.bash_profile:

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

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

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


检查您的$ PATH

tox具有命令行模式:

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

在哪里?

(编辑:2.7东西在这里没什么大不了,在任何3.x中都是sub,并且pip的表现方式几乎相同)

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

我的$ PATH中有什么?

1
2
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?这就是找到我点子安装的东西的原因

现在,要查看Python的来源,请尝试执行此操作(用rosdep代替tox)。

1
2
3
$python
>>> import tox
>>> tox.__file__

打印出的

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

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

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

输出:

1
2
3
4
5
6
7
8
Headers
Python
Resources
bin
include
lib
man
share


如果使用--user(例如pip3.6 install --user tmuxp)进行安装,则可以使用site模块从Python本身获取特定于平台的用户安装目录。例如,在macOS上:

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

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

1
2
3
# 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上使用pip3.6

如果您不介意软件包消失的想法,可以使用python2python3代替:

1
2
3
4
5
# 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"

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

我遇到了此问题中描述的问题,通过pip安装了pdfx软件包。

但是当我运行它时,什么都没有...

1
2
pip list | grep pdfx
pdfx (1.3.0)

但是:

1
2
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文件中:

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

在那之后,重新启动您的外壳,一切应该按预期进行。


解决方案

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

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

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

解释

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

1
python3 -m site --user-base

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

因此我们将路径连接起来:

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

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

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

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


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

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

1
2
3
entry_points = {'console_scripts':

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

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


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

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


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

警告-我相信最好将pip3与Python3配合使用-以获取未来的收益。

如果您已经安装了Python3,则以下步骤可在macOS Mojave上为我工作:

  • 首先使用sudo-sudo -H pip3 install ansible

    安装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并重新启动所有终端外壳。

  • 类型ansible --version


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

    1
    chown -R ~/Library/Python/