首页 > 解决方案 > 以python方式基于平台更改函数的行为

问题描述

用例:

必须使用 pythonsubprocess32模块来处理超时,但代码也可以在 Windows 上运行。模块文档建议

if os.name == 'posix' and sys.version_info[0] < 3:
    import subprocess32 as subprocess
else:
    import subprocess

问题:

我认为上述方法没有考虑到像communicate, check_output,之类的方法仅具有wait模块的参数。使用此方法对它们的所有调用都将失败timeoutsubprocess32

我不希望实现相同功能的 2 个不同变体,有条件地导入模块和所有内容。

寻找一种处理这个的pythonic方式。我的直觉说,decorators功能partial应该有所帮助,但似乎无法准确而简洁地找到方法。

有什么建议么 ?

标签: pythoncross-platform

解决方案


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

推荐阅读