Python 意外异常:名称';基串';调用ansible2时未定义

Python 意外异常:名称';基串';调用ansible2时未定义,python,python-3.x,ansible,ansible-2.x,Python,Python 3.x,Ansible,Ansible 2.x,我正在尝试执行ansible2命令 当我这样做时: ansible-playbook -vvv -i my/inventory my/playbook.yml 我得到: 意外异常:未定义名称“basestring” 完整的回溯是: Traceback (most recent call last): File "/usr/local/bin/ansible-playbook", line 85, in <module> sys.exit(cli.run()) Fil

我正在尝试执行ansible2命令

当我这样做时:

ansible-playbook -vvv -i my/inventory my/playbook.yml
我得到:

意外异常:未定义名称“basestring” 完整的回溯是:

Traceback (most recent call last):
  File "/usr/local/bin/ansible-playbook", line 85, in <module>
    sys.exit(cli.run())
  File "/usr/local/lib/python3.4/site-packages/ansible/cli/playbook.py", line 150, in run
    results = pbex.run()
  File "/usr/local/lib/python3.4/site-packages/ansible/executor/playbook_executor.py", line 87, in run
    self._tqm.load_callbacks()
  File "/usr/local/lib/python3.4/site-packages/ansible/executor/task_queue_manager.py", line 149, in load_callbacks
    elif isinstance(self._stdout_callback, basestring):
NameError: name 'basestring' is not defined
这里是
python--version

Python 3.4.3

Ansible低于2.5版要求在控制主机上安装Python 2.6或2.7:

basestring
在Python 3中不再可用。发件人:

已删除内置的
基串
抽象类型。改用
str
str
bytes
类型没有足够的公共功能来保证共享基类。
2to3
工具(见下文)将每次出现的
basestring
替换为
str


因此,解决方案是要么升级Ansible,要么降级Python

基串在Python 3中不可用:

对于python 2.x和3.x,可以通过以下方式修复此问题:

try:
  basestring
except NameError:
  basestring = str

我在使用Python 3和Ansible时遇到了这个问题,通过分叉dopy项目并在Ansible脚本中安装dopy解决了这个问题:

name:git+https://github.com/eodgooch/dopy@0.4.0#egg=dopy

如果仍然出现错误,请确保将
版本
更改为
0.4.0
,并从Python站点包目录中删除任何延迟的dopy包


您还可以
pip3安装git+https://github.com/eodgooch/dopy@0.4.0#egg=dopy
而不是在您的Ansible任务中。

将基串替换为str。在2.x中,存在基串。但是在3.x中,基串被替换为“str”。

问题可能是由于python版本。在2.x中,基串是存在的,但在3.x中,它被替换为“str”。

如果这对其他人有帮助,当我使用
pip
pip3
安装ansible时,它错误地指向python3,但当我使用
pip2安装ansible
时,它工作正常,将它放在每个ansible实用程序的顶部:
#/usr/local/opt/python/bin/python2.7
我觉得这是pip或python包中的一个缺陷。我不应该安装与python3不兼容的pip3。我可以通过安装来实现这一点ansible@2.5.0:
python3-m pip install ansible==2.5.0
。接下来,为什么不使用
(str,bytes)
作为
基串
?对于
isinstance(var,(str,bytes))
来说效果非常好。那么您的建议是重写ansible代码?当然,继续…
pip卸载dopy
pip3安装git+https://github.com/eodgooch/dopy@0.4.0#egg=dopy
为我工作。非常感谢。不是Python2上的
isinstance(b“”,basestring)==True
,而是Python3上的
isinstance(b“”,str)==False
。我更喜欢这个,因为我需要在两种环境中运行代码。我觉得它很粗糙,但现在正适合我。谢谢
try:
  basestring
except NameError:
  basestring = str