结构导入错误:无法导入名称'isMappingType'



在为Django项目部署fabfile的过程中,我遇到了"ImportError:cannot import name'isMappingType'"。

1.这是我的fabfile.py 的结构

from __future__ import with_statement
from fabric.api import *
from fabric.contrib.console import confirm
from fabric.contrib.files import append, exists, sed
env.hosts = ["127.0.0.1"]
env.user = raw_input('Please enter user:')
def deploy():
      sudo("apt-get update -y")
sudo("apt-get install git -y")
sudo("apt-get install postgresql libpq-dev python-dev python-pip -y")
code_dir = 'backend-directory'
if exists(code_dir):
   run('cd %s && git pull' % (code_dir,)) 
else:
   run("git clone git://serveraddress/projects/backend-directory")

with cd(code_dir):
  sudo("pip install virtualenv")
  run("virtualenv -p /usr/bin/python3.4 venv")
  run("source venv/bin/activate")
  #sudo("pip install -r requirements/dev.txt")
  sudo("pip install -r requirements/production.txt")
  with settings(warn_only=True):
    with settings(sudo_user = 'postgres'):
        sudo("psql -c " + '"CREATE USER new_user WITH PASSWORD ' + "'new_password';" + '"')
        sudo("psql -c 'ALTER USER new_user CREATEDB;'")
        sudo("psql -c 'CREATE DATABASE newdb;'")
        sudo("psql -c 'GRANT ALL PRIVILEGES ON DATABASE 'newdb' to new_user;'")
    if run("nginx -v").failed:
        sudo(" apt-get install nginx -y")
code_dir = 'frontend-directory' 
if exists(code_dir):
   run('cd %s && git pull' % (code_dir,)) 
else:
   run("git clone git://serveraddress/frontend-directory")

code_dir = 'backend-directory/project_site'
with cd(code_dir):
    run("python manage.py makemigrations --settings=project.settings.development")
    run("python manage.py migrate --settings=project.settings.development")
    sudo("/etc/init.d/nginx start")
    with settings(warn_only=True):
      if run("find /etc/uwsgi").failed:
          sudo("mkdir /etc/uwsgi")
      if run("find /etc/uwsgi/vassals").failed:
          sudo("mkdir /etc/uwsgi/vassals")
      if run("find /etc/uwsgi/vassals/pam_uwsgi.ini").failed:
          sudo("ln -s ~/backend-direcoty/project_site/pam_uwsgi.ini /etc/uwsgi/vassals/") 
    run("uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data")

接下来,我在虚拟环境中执行了以下命令

(venv)praneeth@praneeth-Latitude-E6400 ~/wru-pam $ fab deploy

我得到了以下回溯:-

Traceback (most recent call last):
  File "/home/praneeth/wru-pam/venv/bin/fab", line 9, in <module>
    load_entry_point('Fabric==1.10.1', 'console_scripts', 'fab')()
  File "/home/praneeth/wru-pam/venv/lib/python3.4/site-packages/pkg_resources/__init__.py", line 474, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/praneeth/wru-pam/venv/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2582, in load_entry_point
    return ep.load()
  File "/home/praneeth/wru-pam/venv/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2265, in load
    return self._load()
  File "/home/praneeth/wru-pam/venv/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2268, in _load
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/praneeth/wru-pam/venv/lib/python3.4/site-packages/fabric/main.py", line 12, in <module>
    from operator import isMappingType
ImportError: cannot import name 'isMappingType'

此导入错误的原因可能是什么?

fabric不支持Python 3:

Fabric是一个Python(2.5-2.7)库和命令行工具,用于简化SSH在应用程序部署或系统中的使用管理任务。

另请参阅其他要点和解决方法:

  • Python 3对fabric的支持
  • python3兼容性

据我所知,迁移到invoke是第一件需要考虑的事情。


演示问题的快速测试:

$ python2.7
>>> from operator import isMappingType
>>>
$ python3.4
>>> from operator import isMappingType
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'isMappingType'

在发布Python3结构实现之前,您还可以使用任何可用的fork。

其中一个可在fabric3pip包中获得,该包与Python3:兼容

pip install fabric3pip3 install fabric3 安装

  • GitHub 上的Fabric3

  • Python包索引中的Fabric3

以下问题的一个答案中也提到了这一点:Python 3对fabric的支持

我个人在一个Pelican博客中使用它,该博客使用织物来构建或服务该网站。目前,它运行完美。

python2:pip安装结构python3:pip安装fabric3

这就是我修复它的方法,删除python3

sudo apt-get remove 'python3.*'

使用安装结构

pip install fabric
sudo apt-get install fabric

我在运行fab polish之后遇到了这个错误:

zsh:/usr/local/bin/fab:错误的解释器:/usr/bin/python3:没有这样的文件或目录

在vim中打开/usr/local/bin/fab作为sudo,&更改第一行,即#!/usr/bin/python3#!/usr/bin/python2.7

保存&运行fab抛光。现在一切都好!

最新更新