更改函数';基于平台的行为,pythonically

更改函数';基于平台的行为,pythonically,python,cross-platform,Python,Cross Platform,用例: 必须使用python子流程32模块超时,但代码也可以在windows上运行。模块文档建议 if os.name == 'posix' and sys.version_info[0] < 3: import subprocess32 as subprocess else: import subprocess 如果os.name=='posix'和sys.version\u info[0]

用例:

必须使用python
子流程32
模块超时,但代码也可以在windows上运行。模块文档建议

if os.name == 'posix' and sys.version_info[0] < 3:
    import subprocess32 as subprocess
else:
    import subprocess
如果os.name=='posix'和sys.version\u info[0]<3:
将子流程32作为子流程导入
其他:
导入子流程
问题:

我认为上述方法没有考虑到像
通信
检查输出
等待
这样的方法只有
子流程32
模块才有
超时
参数。 使用此方法时,对这些对象的所有调用都将失败

我不希望实现同一函数的两个不同变体,有条件地导入模块和所有东西

正在寻找一种类似蟒蛇的方法来处理这个问题。我的直觉是,
decorators
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
从functools导入部分
从子流程导入检查输出
导入子流程
如果os.name=='posix'和系统版本信息[0]<3:
从子流程32导入检查输出
将子流程32作为子流程导入
检查输出=部分(检查输出,超时=10)
def execute_cmd(cmd,args):
命令=[]
command.append(cmd)
command=command+args
尝试:
proc\u out=检查输出(命令,stderr=子进程.STDOUT)
除subprocess.CalledProcessError为e外:
打印(“未能执行本地命令\n错误代码:%s,输出:%s”,
e、 cmd,e.returncode,e.output)
#我希望在这里处理TimeoutExpired异常,但这不是通用的
除:
打印(“命令%s在主机上执行失败”,命令)
提升

您可能需要在程序中语法不同的部分为不同的平台编写两套代码。在行为不同的地方使用类似的if语句我希望避免这种情况,这正是我在帖子中提到的