免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16230 | 回复: 11
打印 上一主题 下一主题

求助python 跳出while循环问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-25 15:57 |只看该作者 |倒序浏览
本帖最后由 ZX424 于 2010-05-26 00:49 编辑

由于工作要求,需要使用python的PEXPECT模块进行交换机配置文件的自动备份
本人刚接触python不久,写的代码又臭又长,请各位见谅
  1. #!/usr/bin/python
  2. import sys
  3. import time
  4. import os
  5. import pexpect
  6. now = time.strftime("%y%m%d", time.localtime())     #取得系统日期
  7. os.mkdir("/var/ftp/%s" % now, 0777) #创建目录
  8. os.chmod("/var/ftp/%s" % now, 0777)  #更改目录权限
  9. aa = open ('/var/ftp/%s/log.txt' % now, "w") #开启日志
  10. fout = open ('log.txt', "w")
  11. IP = open('1','r') #IP地址存放的文件
  12. PASS = open('2','r') #PASSWORD存放的文件
  13. while 1:
  14.       READIP = IP.readline() #读取IP第一行
  15.       READPASS = PASS.readline() #读取PASSWORD第一行
  16.       if not READIP: #如果读完IPFILE最后一行,就跳出循环
  17.             print 'END'
  18.             break
  19.       path = now + '/' + READIP
  20.       foo = pexpect.spawn('telnet %s' % READIP) 创建连接
  21.       foo.log_file = fout
  22.       foo.expect(['Username:']) #等待字符串'Username:'
  23.       foo.sendline('admin') #输出admin
  24.       foo.expect(['Password:'])
  25.       foo.sendline('admin')
  26.       foo.sendline('en')
  27.       foo.expect(['Password:'])
  28.       foo.sendline(READPASS) #输出PASSWORD
  29.       foo.expect(['#'])
  30.       foo.sendline('copy flash:config.text ftp:') #通过FTP备份配置文件
  31.       foo.expect(['Address or name of remote host'])
  32.       foo.sendline('192.168.52.3') #FTP SERVER
  33.       foo.expect(['config.text'])
  34.       foo.sendline(path) #FTP上传名
  35.       a = foo.expect (['bytes/sec', 'Error', pexpect.EOF, pexpect.TIMEOUT)
  36.       if a == 0:
  37.             aa.write('%s......ok\n' % READIP)
  38.             foo.expect(['#'])
  39.             foo.sendline('quit')
  40.       if a == 1:
  41.             aa.write('%s......failed\n' % READIP)
  42.             foo.sendline('quit')
  43.       foo.expect(['closed'])
  44.       foo.interact
  45. #      if not READIP:   #(移动此3行至16行)
  46. #            print 'END'  #(移动此3行至16行)
  47. #            break          #(移动此3行至16行)
  48. print 'done'

复制代码
IPFILE里一共有3个IP地址
PASSWORDFILE里也存放着3个密码

但是执行完3个IP地址后他显示:
Traceback (most recent call last):
  File "./python.py", line 19, in <module>
    foo.expect(['Username:'])
  File "/usr/local/lib/python2.5/site-packages/pexpect.py", line 589, in expect
    return self.expect_list(compiled_pattern_list, timeout)
  File "/usr/local/lib/python2.5/site-packages/pexpect.py", line 664, in expect_list
    c = self.read_nonblocking (1, timeout)

理应是执行 print 'END'然后跳出循环,但是他又继续执行了 while  中的 foo.expect(['Username:'])

请问各位大虾,问题到底出在哪了呢?

同样,我又写了一段代码:
  1. #!/usr/bin/python
  2. import sys
  3. import os
  4. IP = open('1','r')
  5. PASSWORD = open('2','r')
  6. while 1:
  7.       READIP = file.readline()
  8.       READPASSWORD = pafile.readline()
  9.       print READIP
  10.       print READPASSWORD
  11.       if not READIP:
  12.             print 'ok'
  13.             break
复制代码
读完IP文件后 很正常的打印'OK' 并跳出循环了,但是为什么上面那个不行呢?诚请协助.

论坛徽章:
0
2 [报告]
发表于 2010-05-25 16:47 |只看该作者
把这段代码放到
#  if not READIP: #如果读完IPFILE最后一行,就跳出循环
#   print 'END'
#   break
下面这段代码
#  READIP = IP.readline() #读取IP第一行
# READPASS = PASS.readline() #读取PASSWORD第一行
的后边

论坛徽章:
0
3 [报告]
发表于 2010-05-25 17:12 |只看该作者
谢谢TMBest
我尝试了一下,还是没有成功的跳出循环
依旧没有见到 print 'END'与 print 'done'

论坛徽章:
0
4 [报告]
发表于 2010-05-25 18:28 |只看该作者
给出的错误信息不全啊,光给出了Traceback,最关键的错误名称和错误内容反而没发。
而且程序的缩进也不对,看起来很吃力。

论坛徽章:
0
5 [报告]
发表于 2010-05-25 21:40 |只看该作者
看我的代码吧:
  1. #!/usr/bin/env python
  2. #coding:UTF-8

  3. #ipfile记录三行ip地址:
  4. #分别是192.168.1.1-192.168.1.3
  5. ip=open('ipfile','r')
  6. #pwfile三行密码:
  7. #分别是password_in_line1-password_in_line3
  8. passWord=open('pwfile','r')
  9. while 1:
  10.     readIp=ip.readline()
  11.     readPass=passWord.readline()
  12.     print readIp
  13.     print readPass
  14.     if not readIp:
  15.         print 'All have done whithout ERROR!'
  16.         break
  17. print "Test Over!"
复制代码
运行结果:
192.168.1.1

password_in_line1

192.168.1.2

password_in_line2

192.168.1.3
password_in_line3


All have done whithout ERROR!
Test Over!

论坛徽章:
0
6 [报告]
发表于 2010-05-26 00:05 |只看该作者
本帖最后由 luffy.deng 于 2010-05-26 00:07 编辑

回复 1# ZX424
不出问题就怪了,你那样写用什么写都得出问题。好好看看你的程序逻辑。
while 1:
       READIP = IP.readline() #读取IP第一行
       if  not   READIP:    #在这里就要判断。

论坛徽章:
0
7 [报告]
发表于 2010-05-26 00:06 |只看该作者
本帖最后由 ZX424 于 2010-05-26 00:32 编辑

非常感谢3位的帮助。
TO jjj137 :
      已经修正了程序的缩进,当初直接复制代码到论坛没有重新审阅,给您带来的不便非常抱歉。
    还有就是如何找到“最关键的错误名称和错误内容反而没发。”? 刚接触PYTHON不久,而且之前也没学过编程。我只把运行结束后报的错截上来了而已,其他错误信息该如何去查看?

TO GOD_Father :
      光是执行print我也可以顺利跳出循环,但是不知道为什么放到第一段代码中就无法跳出循环了,很是郁闷.

TO  luffy.deng :
      大虾指出的很对,这的确是我当初没有考虑到的,谢谢.只是我按照你的和2楼的大虾的方法修改了程序,依旧没有跳出循环.

论坛徽章:
0
8 [报告]
发表于 2010-05-26 01:29 |只看该作者
我是说你的错误信息没有贴完全,肯定少了一行。
另外,建议把文件逐行读取写成这样:
  1. for READIP in IP:
  2.     READPASS = PASS.readline()
  3.     ...
复制代码
这样应该就不存在跳不出循环的问题了,如果 IP 文件较大,使用迭代效率也会提高。

论坛徽章:
0
9 [报告]
发表于 2010-05-26 08:42 |只看该作者
能不能看一下你的ip文件,我怀疑末尾有多余的空行。

论坛徽章:
0
10 [报告]
发表于 2010-05-26 09:27 |只看该作者
应该不是空行的问题,如果有空行
他的第二段代码,测试循环的那个也应该出问题,不会得到正确结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP