<python>python 2.7

本文档详细介绍了Python 2.7的基本语法、格式规范、内存管理及对象概念等内容。从注释、赋值操作讲起,涵盖数字、字符串、列表等基本数据类型,以及比较、布尔运算等对象操作。

由于以后的学习会设计到wxpython,而python3.x没有匹配的wxpython,所以重新装了python 2.7。所以所有的语法均基于python 2.7版本,我看的书是python核心编程。

 

一、语法

1. #后为python的注释

2.\n 换行符

3.\ 续行符

4.分号 用于分割同一行上的两个子句

5.冒号 分割函数,类,控制语句等等的标题和后续子句

# this is an example
print 'aaa\nbbb'
print 'aaa\
bbb'
a = 5
if a>5:
    print 'a>5'

运行:

>>> 
aaa
bbb
aaabbb

6.赋值操作

python2.7支持以下模式的赋值:

而且,有一点不同于c语言:在交换两个变量的值时,不需要临时变量

7.标识符

首字母为_或字母

后续字符为字母,数字和_

大小写敏感

python的关键字:

and  elif  global  or

assert  else  if  pass

break  except  import  print

class  exec  in  raise

continue  finally  is  return

def  for  lambda  try

del  from  not  while

说说这些关键词的用处吧:

and,or,not  布尔运算符,python中有布尔类型的,值为true,false

几个例子:

在2.7:

在3.3

(上面 3>2>1等价于 3>2 and 2>1)

在python里,数值的非零,字符串的非空可以等价于布尔的true,反之0和空字符串等价到false。

elif == else if

print 输出语句

在2.x中print是一条语句,不需要括号,但在3.x中,print()是一个函数。

 

二、风格

缩进:

python中没有括号,但使用缩进来表示程序的格式,tab键缩进。

 

 

三、内存管理

python 中变量不需要定义,变量没有类型,变量名可以回收使用,del语句可以收回使用中的变量。

关于对象和变量,我的看法是,对象是内存中的一块,存放数值或字符串等等,变量是独立的标识符,无法通过变量修改对象,变量可以关联到对象,从而拥有对象的值和类型。《python核心编程》书上有一种很形象的说法:

对象是内存中的一块,对象就像一个盒子,当赋值出现时,就是将变量关联到盒子上,此时变量的值就是对象的值,变量相当于这块内存的一个别名,每一次赋值,这块内存的引用计数(被引用的次数,即别名的个数),就+1,初始赋值计数为1.

当关联到该内存变量指向了另一块内存(即改变了变量的值)那么引用计数就会-1.当引用计数为0时,该块内存就会被回收。

del语句可以强制用来减少引用计数(即撤销变量)。

内存分配这里,涉及到python的一些小整数和短字符串的优化问题,我想只要大概了解一下就好了,毕竟使用python是不需要程序员掌管内存的使用的。

 

四、对象

python中的对象是有类型和值和内存地址的。即三个特性:实体(identity):可以用id()获取,类型和值

标准数据类型:

1.数值:普通整数,长整数,浮点数,复数

①整数在32位机表示大小:-2**31 -- 2**31-1。整数有10进制,8进制(以0开头),16进制(以0x开头)。

②长整形是整形的超集,在数字后加l或L区别。同样有三种进制。

③浮点数对应于c中的double型,可以用10进制和科学计数法表示。

④复数形如a+bj。

有复数num,num.real获取num的实数部分,num.imag获取虚数,num.conjugate()获取复数记号形式。

数值操作:+,-,*,/,%,**,对整数:~(取反),<< ,>>, &,^,|

数值函数:类型转换函数-int(obj),float(obj),long(obj),complex(obj)/complex(real,imag),

abs(num),取绝对值

coerce(num1,num2),将num1和num2转换成同一种类型,返回一个表列形式的转换结果。

divmod(num1,num2),返回(num1/num2,num1%num2)

pow(num1,num2,mod=1),乘方,若有mod参数,再对乘方求除法余数。

round(flt,ndig=0),返回一个数,其精确到flt小数点后ndig位。若ndig缺省,则返回最接近flt的整数。

进制转化-hex(),oct()

ASCII转换-ord(str),chr(num)

2.字符串string

3.列表list

4.表列tuple

5.字典dictionary

内建数据类型:

1.type 2.none 3.file 4.function 5.module 6.class 7.class instance 8.method

 内部数据类型:

1.code 2.frame 3.traceback 4.slice 5.ellipsis 6.xrange

 

对象的操作:

1.比较

< ,> ,<= ,>= ,== ,!= ,<>(不再使用)  返回值是布尔值true 或false

2.对象的比较

判断变量是否关联到同一个对象。使用is 和 is not。相当于用id()来判断。

例子:

第一个例子中a,b指向同一个1.3可以理解,第二个例子中这两个1.3在内存中位置是不同的。

再看:

发现上述情况,这是python中对小整数和短字符串的优化,使内存中只有一个小整数和短字符串,因为python解释器认为小整数和短字符串经常使用。

大整数,长字符串时:

3.布尔运算

前面已有叙述。

 

内建函数:

cmp(obj1,obj2), repr(obj), 'obj' , str(obj) ,type(obj)

1.cmp(obj1,obj2)比较obj1 和 obj2 的大小,obj1 > obj2 返回值>1,若obj1 < onj2,返回值<1,若两者等于,返回0.

cmp的参数可以是

2.str(obj)与repr(obj)和 'obj'

这三个函数是返回obj的字符串形式。

但三者是有一些区别的.

先说str()和repr()的区别:str(obj)返回的是obj的可打印字符串表达形式。比如:

而repr(obj)返回的是obj的正是字符串:

再谈repr()和' '

两者功能一样,但书写要注意使用转义字符:

 

3.type(obj):该函数返回obj的类型。

该函数可以通过与其他type(obj1)的比较,判断obj的类型。

例子:

可以得出,a是float类型。

 

对象的分类:

1.根据存储摸型分类:

只能存储一个对象的类型称为,文字/离散存储,数字,字符串

反之,称为包容器存储,list,tuple,dictionary

2.根据是否可修改分类:

可修改: list,dictionary

不可修改:数字,字符串,tuple

 3.根据访问模型分类:

直接访问(单个元素):数字

序列方式访问(通过下标访问):字符串,list,tuple

映射图放射访问(通过关键字访问):dictionary
 

 

su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn't match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning [root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn't match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning 您在 /var/spool/mail/root 中有邮件 [root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.10.2) or chardet (3.0.4) doesn't match a supported version! RequestsDependencyWarning) Traceback (most recent call last): File "/usr/bin/keystone-manage", line 6, in <module> from keystone.cmd.manage import main File "/usr/lib/python2.7/site-packages/keystone/cmd/manage.py", line 19, in <module> from keystone.cmd import cli File "/usr/lib/python2.7/site-packages/keystone/cmd/cli.py", line 29, in <module> from keystone.cmd import bootstrap File "/usr/lib/python2.7/site-packages/keystone/cmd/bootstrap.py", line 17, in <module> from keystone.common import driver_hints File "/usr/lib/python2.7/site-packages/keystone/common/driver_hints.py", line 18, in <module> from keystone import exception File "/usr/lib/python2.7/site-packages/keystone/exception.py", line 20, in <module> import keystone.conf File "/usr/lib/python2.7/site-packages/keystone/conf/__init__.py", line 20, in <module> from osprofiler import opts as profiler File "/usr/lib/python2.7/site-packages/osprofiler/opts.py", line 18, in <module> from osprofiler import web File "/usr/lib/python2.7/site-packages/osprofiler/web.py", line 20, in <module> from osprofiler import profiler File "/usr/lib/python2.7/site-packages/osprofiler/profiler.py", line 27, in <module> from osprofiler import notifier File "/usr/lib/python2.7/site-packages/osprofiler/notifier.py", line 16, in <module> from osprofiler.drivers import base File "/usr/lib/python2.7/site-packages/osprofiler/drivers/__init__.py", line 4, in <module> from osprofiler.drivers import loginsight # noqa File "/usr/lib/python2.7/site-packages/osprofiler/drivers/loginsight.py", line 25, in <module> import requests File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 94, in <module> from urllib3.exceptions import DependencyWarning ImportError: cannot import name DependencyWarning
最新发布
06-08
<think>我们正在处理的问题是在执行`keystone-managedb_sync`时出现的错误:`ImportError:cannotimportnameDependencyWarning`根据错误信息,问题出在Python2.7环境下,与`DependencyWarning`的导入有关。结合引用的内容,我们可以分析出:-引用[1]中提到一个与urllib3和chardet版本不匹配相关的警告,这可能导致某些模块无法正确导入。-引用[2]中给出了一个修改导入队列的示例,但这里的问题不是队列,而是`DependencyWarning`。-引用[3]和[4]则涉及Python包冲突和安装依赖的问题。由于错误信息中提到了`DependencyWarning`,而这个名称在Python标准库中属于`requests`包的依赖警告(通常在`requests`中触发)。实际上,在较新版本的`requests`中,可能已经不再支持Python2.7,或者存在版本兼容性问题。然而,`DependencyWarning`是Python标准库中的内置警告类型,通常在`warnings`模块中定义。但是,错误信息是`cannotimportnameDependencyWarning`,这意味着在尝试导入时,Python找不到这个名称。这可能是因为在Python2.7中并没有`DependencyWarning`这个名称,它是在Python3中引入的。查阅Python2.7的文档,确实没有`DependencyWarning`。在Python3中,`DependencyWarning`是`warnings`模块中的一个警告类别。所以,这个错误很可能是因为代码试图在Python2.7环境下导入一个只存在于Python3中的警告类别。在引用[1]中,我们看到了一个与`requests`相关的警告:`RequestsDependencyWarning`。这个警告是`requests`库自定义的,位于`requests`包的`__init__.py`中。在`requests`的代码中,它可能尝试从`warnings`导入`DependencyWarning`,但是在Python2.7中不存在,因此导致了`ImportError`。所以,我们需要修改`requests`包的源码,使其在Python2.7环境下不再尝试导入`DependencyWarning`。具体步骤:1.找到`requests`包的安装位置,通常在`/usr/lib/python2.7/site-packages/requests/`。2.打开`__init__.py`文件。3.查找包含`DependencyWarning`的代码行,将其修改为兼容Python2.7的写法。根据引用[1]的报错信息,错误发生在`/usr/lib/python3.6/site-packages/requests/__init__.py`,但是我们当前的问题是在Python2.7环境中,所以我们需要查看Python2.7的`requests`包中相同的文件。在Python2.7的`requests/__init__.py`中,我们可能会发现类似以下代码:```pythontry:from.packages.urllib3.contribimportpyopensslexceptImportError:passelse:pyopenssl.inject_into_urllib3()```或者,在较新版本的`requests`(但支持Python2.7的版本)中,可能已经有处理Python2.7Python3差异的代码。但是,如果我们的版本是较新的(虽然支持2.7,但可能默认使用3的写法),则可能没有正确处理。在引用[1]中,错误发生在第91行,提示`RequestsDependencyWarning`警告。所以,我们可以在`requests/__init__.py`中找到相关代码。但是,我们也可以考虑降级`requests`包,因为较新版本的`requests`可能已经放弃对Python2.7的支持。我们可以安装一个与Python2.7兼容的旧版本`requests`。但是,考虑到我们的环境是OpenStack,可能对依赖版本有严格要求,所以修改源码可能是更快的方式。让我们假设在`requests/__init__.py`中存在如下导入:```pythonfromwarningsimportDependencyWarning```这在Python2.7中会失败。我们可以将其修改为:```pythontry:fromwarningsimportDependencyWarningexceptImportError:classDependencyWarning(Warning):pass```这样在Python2.7中就不会抛出导入错误,而是定义一个自定义的`DependencyWarning`警告类。但是,我们需要知道,在`requests`中,这个警告是在什么情况下使用的?实际上,如果只是警告,我们可以忽略它,或者将警告过滤掉。但是,由于导入发生在代码顶部,所以我们需要确保导入成功。另外一种方法:既然在Python2.7中没有这个警告,那么我们可以将导入的代码注释掉,然后替换为一个普通警告(Warning)或者用`UserWarning`代替。具体步骤:1.打开`/usr/lib/python2.7/site-packages/requests/__init__.py`。2.查找`DependencyWarning`。3.将导入语句改为:```pythontry:fromwarningsimportDependencyWarningexceptImportError:#ForPython2.7,defineourownclassDependencyWarning(Warning):pass```或者,如果你在文件中找不到明确的导入`DependencyWarning`的行,而是看到类似`RequestsDependencyWarning`的定义,那可能是`RequestsDependencyWarning`继承自`DependencyWarning`。比如:```pythonclassRequestsDependencyWarning(DependencyWarning):pass```那么,我们就需要先定义`DependencyWarning`。如果代码中直接使用了`DependencyWarning`(比如在抛出警告的时候),那么我们就需要保证`DependencyWarning`存在。修改后的代码示例(在`requests/__init__.py`的顶部,在定义`RequestsDependencyWarning`之前)添加:```pythontry:fromwarningsimportDependencyWarningexceptImportError:classDependencyWarning(Warning):"""Dependencywarningforrequests,usedwhenanimportedpackageisnotatthecorrectversion."""pass```然后,确保后续定义`RequestsDependencyWarning`时继承这个类(如果是Python2.7,就是继承我们自定义的类;如果是Python3,就是继承标准库的类)。但是,更安全的方式是安装一个支持Python2.7的旧版`requests`,例如2.20.0以下版本(因为在新版本中可能移除了对Python2.7的支持)。我们可以在引用[3]中看到使用了`pipinstall`命令,我们可以用类似命令安装:```bashpipuninstallrequestspipinstallrequests==2.20.0```但是,由于OpenStack可能依赖特定版本,所以我们需要谨慎。可能最好的办法是修改源码。另外,错误信息中提到了`osprofiler`,这可能是OpenStackProfiler,它也可能有依赖问题。所以,我们还需要确保其他依赖包兼容Python2.7。总结解决步骤:**方案一:降级requests包(可能推荐)**1.卸载当前版本的`requests`:```bashpipuninstallrequests```2.安装兼容Python2.7的`requests`版本,例如2.20.0:```bashpipinstallrequests==2.20.0```3.再次尝试`keystone-managedb_sync`。**方案二:修改requests源码**1.打开`/usr/lib/python2.7/site-packages/requests/__init__.py`。2.在文件顶部(在导入其他模块之前)添加:```pythonimportsysifsys.version_info[0]==2:classDependencyWarning(Warning):passelse:fromwarningsimportDependencyWarning```或者,如果是在定义`RequestsDependencyWarning`的地方,则修改为:```pythonifsys.version_info[0]==2:classRequestsDependencyWarning(Warning):passelse:classRequestsDependencyWarning(DependencyWarning):pass```但要注意,如果原文件中已经使用了`DependencyWarning`,那么我们需要保证它在Python2.7中是可用的。因此,更推荐在文件顶部定义`DependencyWarning`(如果缺失的话),然后使用原有的方式定义`RequestsDependencyWarning`。3.保存文件,然后再次尝试运行命令。**方案三:升级到Python3**因为错误信息中看到有使用Python3.6的路径(引用[1]),说明系统中同时存在Python2Python3。OpenStack从Queens版本开始支持Python3,所以如果可能,建议升级Keystone到Python3环境运行。但这是一个较大的变更,需要谨慎。根据实际情况,如果OpenStack环境是较新的版本,应该支持Python3,那么可以尝试修改Keystone的Python环境到Python3。但注意,这需要重新配置整个环境,可能涉及多个组件。因此,最快捷的方法可能是方案一或方案二。由于引用[3]提到了Python包冲突,以及卸载和安装Python包,我们可以优先尝试方案一。如果方案一不奏效,再尝试方案二。注意:在执行操作前,请备份相关文件,并确保有回滚计划。根据上述分析,我们按照方案一进行:1.确认当前requests版本:```bashpipfreeze|greprequests```2.卸载当前版本并安装指定版本:```bashpipuninstall-yrequestspipinstallrequests==2.20.0```3.再次运行`keystone-managedb_sync`如果仍然出现同样的错误,则说明问题可能不在`requests`的版本上,或者需要同时处理其他包的兼容性问题。那么我们可以考虑方案二。另外,错误信息中还提到了`osprofiler`。这个包可能在导入时也受到了影响。我们可以尝试检查`osprofiler`是否兼容Python2.7。如果`osprofiler`需要Python3,那么我们可能需要将其降级到支持Python2.7的版本,或者将整个环境迁移到Python3。但是,由于我们无法得知具体的OpenStack版本和环境,因此只能给出一般性建议。最终建议:由于OpenStack社区已经逐步放弃Python2,强烈建议将环境升级到Python3(如果OpenStack版本支持的话)。这样可以从根本上解决问题。</think> 基于您提供的信息,我来分析并解决在执行`keystone-manage db_sync`时出现的`ImportError: cannot import name DependencyWarning`问题。这个问题涉及Python 2.7环境中的模块依赖冲突,主要与urllib3、chardet和requests等包有关。 ### 问题原因分析 1. **Python 2.7兼容性问题**: - `DependencyWarning`是Python 3引入的警告类型,在Python 2.7中不存在[^2] - 新版本的urllib3/chardet可能放弃了对Python 2.7的支持 - Keystone管理命令尝试导入不存在的警告类型导致失败 2. **包版本冲突**: - 从引用[1][3]可看出,urllib3 (1.26.4)和chardet (3.0.4)版本存在兼容警告 - Python 2/3包混用导致依赖冲突(如docker-py/python-py冲突) 3. **环境污染问题**: - 多个Python版本共存导致包路径混乱 - 未卸载旧版包就直接安装新版(引用[3]) ### 解决方案 分步解决此问题: #### 1. 降低urllib3/chardet版本 ```bash pip uninstall -y urllib3 chardet requests pip install urllib3==1.25.11 chardet==3.0.3 requests==2.22.0 ``` #### 2. 修改requests库源码(Python2.7兼容) 编辑文件`/usr/lib/python2.7/site-packages/requests/__init__.py`: ```python # 在文件顶部添加以下代码 import sys if sys.version_info[0] == 2: class DependencyWarning(Warning): pass else: from warnings import DependencyWarning ``` #### 3. 清理Python环境 ```bash # 卸载冲突包(参考引用[3]) pip uninstall -y docker-py docker python-py # 重新安装核心依赖 pip install -I six python-subprocess32 python-setuptools yum install -y python-devel ``` #### 4. 重建虚拟环境(推荐) ```bash # 创建新环境(引用[4]) virtualenv /opt/keystone-env source /opt/keystone-env/bin/activate # 安装指定版本依赖 pip install urllib3==1.25.11 chardet==3.0.3 \ requests==2.22.0 osprofiler==3.4.0 # 重新运行同步 keystone-manage db_sync ``` ### 验证方法 执行后检查: ```bash python -c "from warnings import DependencyWarning; print('Import success')" ``` 应输出`Import success` ### 预防措施 1. **隔离环境**:始终使用virtualenv或容器部署 2. **版本锁定**:使用`pip freeze > requirements.txt`固定依赖 3. **Python 3迁移**:建议升级到支持Python 3的OpenStack版本(Queen+) > 关键配置点:必须确保所有服务使用相同Python版本和虚拟环境,避免多版本共存导致的路径冲突[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值