subprocess.wait()传参报错:TypeError参数数量不符问题排查
问题根源与解决办法
嘿,这个问题我之前碰到过,马上给你理清楚:
你写的self.subprocess.wait(60)报错,核心原因是你当前用的Python版本里,subprocess.Popen.wait()方法根本不支持直接传入超时参数。在Python 3.3之前,这个wait()方法只认实例本身(也就是隐式传递的self)这一个参数,你额外塞进去的60被当成了第二个参数,自然就触发了“takes exactly 1 argument (2 given)”的类型错误。
下面给你几个可行的解决思路:
1. 升级Python版本(最省心的方案)
如果你的项目允许升级到Python 3.3或更高版本,wait()方法已经新增了timeout参数,直接调整代码就行,记得要捕获超时异常:
try: self.subprocess.wait(timeout=60) except subprocess.TimeoutExpired: # 超时后可以终止子进程,再做后续处理 self.subprocess.kill() print("子进程执行超时,已终止")
2. 改用communicate()方法(兼容旧版本)
如果没法升级Python,那用subprocess.Popen.communicate()就很合适——这个方法在Python 2.7及以上版本就支持timeout参数,而且还能避免子进程因为管道阻塞挂起的问题,比wait()更可靠:
import subprocess try: # 不需要捕获输出的话,传stdin=None就行 stdout, stderr = self.subprocess.communicate(timeout=60) except subprocess.TimeoutExpired: self.subprocess.kill() # 这里可以加超时后的业务逻辑,比如记录日志
3. 手动实现超时逻辑(适配极旧版本)
要是你的Python版本低于2.7,就得自己动手实现超时了。比如在Unix/Linux环境下可以用信号:
import signal def timeout_handler(signum, frame): raise Exception("子进程执行超时") # 设置60秒后触发信号 signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(60) try: self.subprocess.wait() signal.alarm(0) # 执行完成后取消超时 except Exception: self.subprocess.kill()
注意这个方法在Windows环境下用不了,因为Windows不支持SIGALRM信号。
内容的提问来源于stack exchange,提问作者Harish Sridharan
相关产品推荐
相关产品推荐

