python-基于平台更改函数的行为

时间:2018-07-13 13:16:38

标签: python cross-platform

用例:

必须使用python subprocess32模块进行超时,但是代码也可以在Windows上运行。模块文档建议

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

问题:

我认为上述方法没有考虑到communicatecheck_outputwait之类的方法仅在timeout模块中具有subprocess32参数。 使用这些方法对这些对象的所有调用都会失败

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

寻找一种处理此问题的Python方法。我的直觉是说decoratorspartial函数应该有帮助,但似乎无法弄清楚精确而简洁的方法。

有什么建议吗?

1 个答案:

答案 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