为啥我使用 setup.py 安装时找不到 ansible?

Posted

技术标签:

【中文标题】为啥我使用 setup.py 安装时找不到 ansible?【英文标题】:Why can't I find ansible when I install it using setup.py?为什么我使用 setup.py 安装时找不到 ansible? 【发布时间】:2018-01-30 22:37:35 【问题描述】:

因为我在使用 Ansible(我在 Mac 上)时遇到了一些问题,今天我通过 pip (sudo pip uninstall ansible) 卸载了 Ansible,并使用 github 存储库重新安装了最新的开发版本经典的 setup.py 方法,似乎成功结束了(full output here.

然后我尝试使用它:

$ ansible --version
-bash: ansible: command not found
$ which ansible
$

我检查了它的安装位置。从上面链接到的完整输出中,我发现它安装在/usr/local/lib/python2.7/site-packages 中,并且确实在那里我找到了一个鸡蛋:

$ ls -l /usr/local/lib/python2.7/site-packages | grep ansible
drwxr-xr-x    4 root    admin     136 Aug 22 16:33 ansible-2.4.0-py2.7.egg

当我启动 Python 并检查 site-packages 文件夹时,我发现了一个不同的文件夹:

>>> import site; print site.getsitepackages()[0]
/usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

但这是指向同一文件夹的符号链接:

$ ls -l /usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
lrwxr-xr-x  1 hielke  admin  54 Aug 13 22:36 /usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages -> ../../../../../../../../../lib/python2.7/site-packages

所以我猜问题是没有为 /usr/local/bin/ 中的 ansible 包创建符号链接。但我不确定如何创建这样的符号链接,以及为什么它一开始就不会出现。

有人知道我如何从这里继续前进吗?欢迎所有提示!

【问题讨论】:

你能显示你的环境变量吗,我无法重现它。 @aristotll - 我不确定你指的是哪个环境变量,但可以肯定的是,这里是 os.environ 的完整粘贴:pastebin.com/b0AuuAaV 这能告诉你什么吗? 你能显示which python的结果吗? @aristotll - /usr/local/bin/python @techraf - 奇怪的是 pip 似乎确实调用了 brew 安装的 python。当我执行cat $(which pip) 时,文件的第一行显示为#!/usr/local/bin/python,这是安装了brew 的Python 的符号链接:ls -l /usr/local/bin/python 给了我/usr/local/bin/python -> ../Cellar/python/2.7.13_1/bin/python。我认为主要问题是在 /user/local/bin/ 中没有为 ansible 包创建符号链接。但我不知道该怎么做。 【参考方案1】:

我建议卸载 Ansible 并根据the method suggested in the Ansible docs 使用pip 重新安装它:

或者,如果您正在寻找最新的开发版本:

pip install git+https://github.com/ansible/ansible.git@devel

如果您在 OS X Mavericks 上安装,您可能会遇到来自编译器的一些噪音。一种解决方法是执行以下操作:

$ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible

使用 virtualenv 的读者也可以在 virtualenv 下安装 Ansible,不过我们建议不要担心,只需全局安装 Ansible。不要使用easy_install直接安装ansible。

【讨论】:

感谢您的建议!你的第一个建议pip install git.. 运行没有问题,但之后命令ansible --version 仍然给我-bash: ansible: command not found,即使我可以完美地在Python 中import ansible。卸载它(再次成功)后,我尝试了您的第二个建议,该建议成功完成,但也给了我一个-bash: ansible: command not found,即使 Python 中的import ansible 也可以正常工作。我想这只是/usr/local/bin/ 中的一个符号链接丢失了,我不知道如何创建它。有什么想法吗? @kramer65 您是否尝试在安装后从新的 shell 运行它?或者,如果在 virtualenv 中安装,将其停用并再次激活,或者直接从 virtualenv 的二进制子目录运行它(Windows 上为Scripts,否则为bin)。【参考方案2】:

当您从 shell 调用 ansible 时,bash 将在您的 $PATH 中搜索名为 ansible 的可执行文件。这可能不是唯一的问题,但这是您看到的错误的直接原因。 .egg 文件本身不是可执行文件,它只是一个用于分发代码的文件。

如果 ansible 已正确安装,您应该可以使用 locate 或 OSX Finder GUI 找到它。名称应该完全匹配,没有文件扩展名。您可能还会在找到ansible 可执行文件的相同位置找到ansible-connectionansible-console 等。如果你找到了,太好了!对其进行测试并将该目录添加到终端中的$PATH,如下所示:

export PATH=$PATH:/path/to/ansible

/path/to/ansible 是您找到可执行文件的目录。 $PATH 变量的这种更改是暂时的,并且会在您关闭 shell 时消失。如果您现在可以从 bash 运行 ansible,那么您可以通过将该导出添加到您的 $HOME/.bash_profile 文件的末尾,或者通过在 /etc/paths.d 中添加一条规则来使更改永久化(Apple 推荐)。如果您不熟悉这些here,请查看更多关于如何执行这些操作的信息。

现在,如果这不是问题并且您找不到ansible 可执行文件,那么安装本身就是您的问题。您也可以尝试使用虚拟环境(如果您已安装)以确保您从 github 提取的版本没有损坏:

git clone https://github.com/ansible/ansible.git
cd ansible
virtualenv venv
source venv/bin/activate
pip install .
which ansible

在撰写本文时,以上内容为我提供了一个有效的 ansible 安装。

【讨论】:

我不知道locate 命令,它很有帮助。它为我找到了以下可执行文件,我可以手动调用它来运行 ansible:/usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/bin/ansible。我现在应该在/usr/local/bin/ 中手动创建指向该文件的符号链接,我应该将文件夹/usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/bin/ 添加到我的路径中,还是您还有其他建议? 您可以手动创建符号链接like so,也可以像我在帖子中提到的那样将/usr/loca/Cellar/.../2.7/bin 文件夹添加到$PATH 变量中。如果您使用 pip 安装的不仅仅是 ansible,我会推荐第二种方法,但如果您只想要 ansible,则符号链接很好。 太棒了,解决了它,另外我还学到了一两件事。谢谢!【参考方案3】:

查找 ansible 在您的 Mac 上的位置。大多数时候是/Users/<yourusername>/Library/Python/3.7/bin/Users/<yourusername>/Library/Python/2.7/bin。那么……

export PATH=$PATH:/Users/<yourusername>/Library/Python/3.7/bin

您可以将其存储在您的 .bashrc 文件中。

【讨论】:

【参考方案4】:

好吧,我想你只需要创建一个软链接

ln -s /Users/$yourname/Library/Python/$python version/bin/ansible /usr/local/bin/ansible

【讨论】:

【参考方案5】:

我在安装 ansible 时遇到了同样的问题。运行以下命令来解决问题。但是如果我们想使用 ansible,每次打开 bash 会话时都必须激活。

$ python -m virtualenv ansible 
$ source ansible/bin/activate
$ pip install ansible 

【讨论】:

【参考方案6】:

我正在使用 zsh,所以在我的 /Users/arojas/.zshrc 中添加了这一行,这就是我的 Ansible 通过 Python 安装的地方

export PATH="$PATH:$HOME/Library/Python/3.7/bin"

【讨论】:

【参考方案7】:

我遇到了同样的问题,安装后使用pip3 install ansible 现在一切正常。

【讨论】:

【参考方案8】:

对于那些使用 Windows 10 Ubuntu 终端的用户,运行此命令应该可以解决问题:

export PATH=$PATH:~/.local/bin

【讨论】:

这个问题是针对 macOS 的【参考方案9】:
      system/instance used: ec2 RH8, as root
      # pip3 install ansible           (not recommended - should be by a user) 
      # ansible --version              ( not found - wtf?!)
      # yum install mlocate
      # update
      # locate ansible                 (long output; scroll to where you input command)
      # export PATH=$PATH:/usr/local/bin     
      # ansible --version               (success, Yes!)

【讨论】:

【参考方案10】:
  system/instance used: ec2 RH8, as root
  # pip3 install ansible           (not recommended - should be by a user) 
  # ansible --version              ( not found - :( )
  # yum install mlocate
  # updatedb (updatedb creates or updates a database used by locate)
  # locate ansible (TL;DR)
  # export PATH=$PATH:/usr/local/bin (Add this line to .bashrc)
  # source .bashrc (To reflect the changes in the bash)  
  # ansible --version               (success, Yes!)

【讨论】:

欢迎来到 Stack Overflow。请阅读How to Answer。我不知道这应该如何回答这个问题。【参考方案11】:
pip3 install ansible --user

这安装在 ~/.local 中。只需将其包含在 PATH 中,它将起作用 例如:export PATH="$PATH:~/.local/bin"

【讨论】:

以上是关于为啥我使用 setup.py 安装时找不到 ansible?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Origin 标头时找不到路由

为啥使用 RDP 时找不到远程 SmartCard

为啥我的代码在渲染时找不到类?

为啥当我直接调用它时找不到类名 laravel5

为啥通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类?

为啥在 regex char 可选时找不到匹配项