【发布时间】:2020-02-16 15:29:47
【问题描述】:
首先,我知道这看起来像是重复的。我一直在阅读:
Python subprocess readlines() hangs
Python Subprocess readline hangs() after reading all input
subprocess readline hangs waiting for EOF
但是这些选项要么直接不起作用,要么我无法使用。
问题
# Obviously, swap HOSTNAME1 and HOSTNAME2 with something real
cmd = "ssh -N -f -L 1111:<HOSTNAME1>:80 <HOSTNAME2>"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=os.environ)
while True:
out = p.stdout.readline()
# Hangs here ^^^^^^^ forever
out = out.decode('utf-8')
if out:
print(out)
if p.poll() is not None:
break
我的困境是调用subprocess.Popen()的函数是一个运行bash命令的库函数,所以它需要非常通用并且有以下限制:
- 必须在输入时显示输出;不要阻止然后一次性向屏幕发送垃圾邮件
- 如果父调用者对库函数进行多处理,则不能使用多处理(Python 不允许子进程拥有子进程)
- 不能使用
signal.SIGALRM,原因与多处理相同;父调用者可能正在尝试设置自己的超时 - 不能使用第三方非内置模块
- 直接向上穿线不起作用。当
readline()调用在线程中时,thread.join(timeout=1)让程序继续运行,但 ctrl+c 根本不起作用,调用sys.exit()不会退出程序,因为线程仍处于打开状态。如您所知,您不能通过设计来杀死 Python 中的线程。 - 没有任何方式的 bufsize 或其他子进程 args 似乎有所作为;也不会将 readline() 放入迭代器中。
如果我可以杀死一个线程,我会有一个可行的解决方案,但这是超级禁忌,尽管这绝对是一个合法的用例。
我愿意接受任何想法。
【问题讨论】:
-
(那些是主机名,而不是 URL。)
标签: python multithreading subprocess