免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2017-08-25 16:57 |只看该作者
我知道怎么解决,但是我就不告诉你

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2017-08-25 23:29 |只看该作者
回复 1# ouiki

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

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

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

论坛徽章:
0
4 [报告]
发表于 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
5 [报告]
发表于 2017-08-28 08:21 |只看该作者
423497786 发表于 2017-08-25 16:57
我知道怎么解决,但是我就不告诉你


论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
6 [报告]
发表于 2017-08-28 20:41 |只看该作者
回复 4# ouiki

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

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

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

论坛徽章:
0
7 [报告]
发表于 2017-08-29 09:12 |只看该作者
q1208c 发表于 2017-08-28 20:41
回复 4# ouiki

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

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

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

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2017-08-29 21:14 |只看该作者
回复 4# ouiki

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP