更改函数';基于平台的行为,pythonically
用例: 必须使用python更改函数';基于平台的行为,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]
子流程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语句我希望避免这种情况,这正是我在帖子中提到的