问题描述
我有一个带硒脚本的python,应该使用每个人不同的参数来调用它(我称它为 Tester.py ),为了简化起见,我将其放入了一个新的python文件中并使用#subprocess这样运行它:
# Explanation about retry is next
@retry(retry_count=5,delay=5)
def job():
try:
subprocess.Popen("python Tester.py -user Margareth",shell=True)
return True
except subprocess.CalledProcessError:
return False
print("System Retrying")
pass
我的重试包装看起来像这样(但是不起作用):
def retry(retry_count=5,delay=5,allowed_exceptions=()):
def decorator(f):
@functools.wraps(f)
def wrapper(*args,**kwargs):
for _ in range(retry_count):
try:
result = f(*args,**kwargs)
if result:
pass
except allowed_exceptions as e:
pass
time.sleep(delay)
return wrapper
return decorator
我与 Tester.py 唯一的问题是硒中的TimeoutException,如果在 x 次和 x 中失败,我想重试它。秒延迟,但是以某种方式#try-catch无法正常工作,而我的重试总是导致随机的第二次重试,而且确实很混乱,有任何线索吗?
解决方法
不需要函数装饰器来实现重试行为。可以通过代码中的“简单” for
循环来完成:
import subprocess
import time
retry_count = 5
delay = 5
success = False
for _ in range(retry_count):
try:
subprocess.Popen("python Tester.py -user Margareth",shell=True)
success = True
break
except subprocess.CalledProcessError:
print("System Retrying")
time.sleep(delay)
在这里,如果subprocess.Popen
调用返回而没有引发错误,则我们跳出循环,否则我们将重试retry_count
次。
此外,请注意,在进行shell=True
通话时尝试尝试不使用subproces.Popen
,因为这可能会给想要被黑客入侵的人打开攻击媒介你的系统。在当前的设置中,由于没有用户输入或通话中没有输入,因此没有立即的风险,但是通常最好的方法是避免输入。