首页   注册   登录
 ouiki 最近的时间轴更新

ouiki

V2EX 第 250730 号会员,加入于 2017-08-25 11:04:59 +08:00
[求助] subprocess 的 stdout 堵塞问题
Python  •  ouiki  •  2017-08-31 13:33:26 PM  •  最后回复来自 lolizeppelin
26
ouiki 最近回复了
2017-08-29 09:07:27 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@guyskk 感谢,那篇文章让我受益良多。
2017-08-29 09:06:52 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@araraloren 再次感谢。
客户那边限制,只能使用 win。

>>> 不过还有一个办法就是你去和 cmd/shell 交互,而不是和你的应用程序交互
这是个思路。
2017-08-28 15:56:49 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@araraloren 谢谢,按你说的确实是有输出。赞啊~~

接下来就是我的问题了,我以为用 mysql,大家都有这个环境,就能很好的说明这个问题。看来大能果然不能糊弄。
我实际的问题和 mysql 类似,是叫“ cisco anyConnect ” 的一个程序( vpncli.exe )。
流程是差不多,通过 vpncli.exe 登录⇒建立 VPN 连接⇒返回状态⇒访问测试页面⇒退出 vpncli.exe 。
所以 mysql -n 参数我是学到了,但 vpncli.exe 没有-n 参数。
2017-08-28 15:18:37 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
感谢大家一直在帮助我,怎奈我天资有限,一直没有解决。
@llbgurs out,err = sub_process.communicate()的意思是线程结束后才返回 stdout 和 stderr 吧?
我的程序不能停止后才返回,还有后续的动作。
2017-08-28 14:59:33 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@topbandit 大神留步。
我改了一下我的代码。试了,不打印。求大神给看看。

def stdout_theard(stdout_lock, p_stdout):
for i in range(3000):
s = p_stdout.readline()
if len(s)>0:
print s # 这里没有打印
time.sleep(0.01)

if __name__ == "__main__":
os.chdir('C:\\Program Files (x86)\\MySQL\\MySQL Server 5.0\\bin')
s_mian_command = 'mysql -h localhost -uroot -p1234'
l_command = ['show databases;', 'use mysql;', 'show tables;']

sub_process = subprocess.Popen(s_mian_command,
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
shell = True)

stdout_lock = threading.Lock()
thread_read_output = threading.Thread(target=stdout_theard,
args=(stdout_lock,sub_process.stdout))
thread_read_output.setDaemon('True')
thread_read_output.start()

for s_command in l_command:
time.sleep(1)
sub_process.stdin.write(s_command + '\r\n')
print s_command # 这里是打印的

打印的结果就是:
show databases;
use mysql;
show tables;

密码啥的都没问题。后台也确确实实执行了的(我用 PowerCmd 能看到后台是执行了的),就是没打印。
黑人问号黑人问号。
2017-08-28 11:05:13 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@topbandit stdout,stderr = Pipe.commucate() 是不是等到进程结束才输出?这个在我的程序里不适用。不能等到结束,还要有后续的动作。(事实上是用 cisco anyConnect 建立连接之后,测试上网)
2017-08-28 11:02:42 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@topbandit 所谓“及时取出 stdout,边读边写”,的意思是 p.stdout.flush() 么?
好像抓到点什么了?
2017-08-28 11:01:44 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
@araraloren 谢谢回复,学到了。
2017-08-28 10:30:45 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
因为 python 的 subprocess 的 stdin,stdout 有阻塞的问题,所以我不会处理。
perl 没有阻塞的问题么?这到是个好消息,我可以用 perl 试试。
2017-08-28 10:08:51 +08:00
回复了 ouiki 创建的主题 Python [求助] subprocess 的 stdout 堵塞问题
放到线程里仍旧是阻塞。
重定向到文件里,写不进去。文件总是空,只有强制退出( Ctrl+C )后,才能写到文件里,看来也是阻塞的问题。

大牛,或者说有没有成功的经验。很可能我的写法也有问题。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4405 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 12ms · UTC 01:55 · PVG 09:55 · LAX 17:55 · JFK 20:55
♥ Do have faith in what you're doing.