python - 以python方式基于平台更改函数的行为
问题描述
用例:
必须使用 pythonsubprocess32
模块来处理超时,但代码也可以在 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 个不同变体,有条件地导入模块和所有内容。
寻找一种处理这个的pythonic方式。我的直觉说,decorators
功能partial
应该有所帮助,但似乎无法准确而简洁地找到方法。
有什么建议么 ?
解决方案
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
推荐阅读
- go - 如何在 Go 中演示内存可见性问题?
- javascript - 如何检测 Bootstrap 模态关闭的方式
- pari - 为循环 Pari 版本 2.11.1 Win64 实现递归并行的问题
- python - 从 MacOS 终端筛选输出并行运行多个 python 脚本
- ios - 在执行功能时单击导航控制器上的后退按钮时应用程序崩溃
- python-3.x - Python内置的时间复杂度?
- parameters - 返回查看 laravel 参数
- database - Mule DB 连接器参数化查询
- c# - 没有引用它的变量时的对象处置
- reactjs - 如何在非反应项目中使用`eslint-config-airbnb`?