用例:
必须使用python subprocess32
模块进行超时,但是代码也可以在Windows上运行。模块文档建议
if os.name == 'posix' and sys.version_info[0] < 3:
import subprocess32 as subprocess
else:
import subprocess
问题:
我认为上述方法没有考虑到communicate
,check_output
,wait
之类的方法仅在timeout
模块中具有subprocess32
参数。
使用这些方法对这些对象的所有调用都会失败
我不希望实现同一功能的2个不同变体,有条件地导入模块和所有内容。
寻找一种处理此问题的Python方法。我的直觉是说decorators
和partial
函数应该有帮助,但似乎无法弄清楚精确而简洁的方法。
有什么建议吗?
答案 0 :(得分:0)
我设计了一种使用partial
函数的超级丑陋的方式
from functools import partial
from subprocess import check_output
import subprocess
if os.name == 'posix' and sys.version_info[0] < 3:
from subprocess32 import check_output
import subprocess32 as subprocess
check_output = partial(check_output,timeout=10)
def execute_cmd(cmd, args):
command = []
command.append(cmd)
command = command + args
try:
proc_out = check_output(command, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print("Failed to execute local command \nError code:%s, Output:%s",
e.cmd, e.returncode, e.output)
# I wish to handle TimeoutExpired exception here, but then this won't be generic
except:
print("Command %s failed to execute on host", command)
raise