忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1116 | 回复: 7

[求助]subprocess的stdout堵塞问题 [复制链接]

论坛徽章:
0
发表于 2017-08-25 11:03 |显示全部楼层
要求是这样的:
1) 登入mysql服务器(mysql -h localhost -uroot -p1234)。
2) 输入mysql内部命令show databases,如果返回的内容出现mysql(存在mysql DB)就立刻强制退出整个python程序。
(关于要求2的解释,假如show databases的返回内容是information_schema \r\n mysql \r\n test。不要等到test出现,马上就退出或者杀死该程序)

我认为只有用subprocess能够比较好的完成以上功能,所以以下都是以使用subprocess为前提。

个人试了好多方法,都不成功。
方法1:把stdout放到线程里

  1.     def stdout_theard(p_stdout):
  2.         time.sleep(0.01)
  3.         for i in range(3000):
  4.             print p_stdout.readline()

  5.     s_command = 'mysql -h localhost -uroot -p1234'
  6.     sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
  7.     thread_read_output = threading.Thread(target=stdout_theard, args=(sub_process.stdout,))
  8.     thread_read_output.setDaemon('True')
  9.     thread_read_output.start()

  10.     sub_process.stdin.write('show databases;\r\n')
复制代码

方法2:把stdout重定向到文件里

  1.     s_command = 'mysql -h localhost -uroot -p1234'
  2.     f_out = tempfile.TemporaryFile(mode='w+')
  3.     f_err = tempfile.TemporaryFile(mode='w+')
  4.     sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = f_out, stderr = f_err, shell = True)
复制代码
或者:   
  1. os.dup2(sub_process.stdout.fileno(), f_out.fileno())
复制代码

以上方法都没成功。
希望前辈高手们指点。

论坛徽章:
1
CU十四周年纪念徽章
日期:2015-12-16 18:25:16
发表于 2017-08-25 16:57 |显示全部楼层
我知道怎么解决,但是我就不告诉你

论坛徽章:
31
荣誉会员
日期:2011-11-23 16:44:17丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17天蝎座
日期:2014-08-21 17:18:48丑牛
日期:2014-08-29 16:06:45天秤座
日期:2014-08-29 10:12:18天秤座
日期:2014-08-26 16:18:20双子座
日期:2014-07-30 11:38:27寅虎
日期:2014-08-04 10:24:12IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:00
发表于 2017-08-25 23:29 |显示全部楼层
回复 1# ouiki

不知道楼主能否换个思路?

我实在没搞懂,为啥非要在中间停下来?

我更没搞懂的是为啥要用shell去执行, 而不是直接用 python 的 mysqldb 来执行 ?

论坛徽章:
0
发表于 2017-08-28 08:18 |显示全部楼层
本帖最后由 ouiki 于 2017-08-28 08:26 编辑
q1208c 发表于 2017-08-25 23:29
回复 1# ouiki

不知道楼主能否换个思路?

我是打了个比方,具体不太好说。
必须得调用一个exe(Cisco AnyConnect),得到返回值。但登陆这个exe的时候,一旦给定的用户名密码错误,它会一直用这组错误的用户名密码试,直到该用户被锁死。
退出的原因就是,在第一次用户名密码错误时,就退出,避免exe反复试,导致锁死。
不知道说明白没。


论坛徽章:
0
发表于 2017-08-28 08:21 |显示全部楼层
423497786 发表于 2017-08-25 16:57
我知道怎么解决,但是我就不告诉你


论坛徽章:
31
荣誉会员
日期:2011-11-23 16:44:17丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17天蝎座
日期:2014-08-21 17:18:48丑牛
日期:2014-08-29 16:06:45天秤座
日期:2014-08-29 10:12:18天秤座
日期:2014-08-26 16:18:20双子座
日期:2014-07-30 11:38:27寅虎
日期:2014-08-04 10:24:12IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:00
发表于 2017-08-28 20:41 |显示全部楼层
回复 4# ouiki

调用的时候,应该可以找到办法限制它重试的次数吧?

如果不行, 可能要换个办法了,subprocess 是有 cache的,
等你看到的时候,那边的执行都结束了。

或许可以试试 pyexpect 。也许能管用。

论坛徽章:
0
发表于 2017-08-29 09:12 |显示全部楼层
q1208c 发表于 2017-08-28 20:41
回复 4# ouiki

调用的时候,应该可以找到办法限制它重试的次数吧?

那个exe本身支持的参数不多,我没找到限制次数的参数。

pyexpect 是个好思路,我试试看。
谢谢回复。

论坛徽章:
31
荣誉会员
日期:2011-11-23 16:44:17丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17天蝎座
日期:2014-08-21 17:18:48丑牛
日期:2014-08-29 16:06:45天秤座
日期:2014-08-29 10:12:18天秤座
日期:2014-08-26 16:18:20双子座
日期:2014-07-30 11:38:27寅虎
日期:2014-08-04 10:24:12IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:00
发表于 2017-08-29 21:14 |显示全部楼层
回复 4# ouiki

我忽然想起来了,你这是要试人家的密码么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP