关于跨平台:python:根据操作系统使用不同的功能

python: use different function depending on os

我想写一个将在Linux和Solaris上执行的脚本。大多数逻辑在两个操作系统上都是相同的,因此我只写一个脚本。但是,由于某些部署的结构会有所不同(文件位置、文件格式、命令语法),因此两个平台上的两个函数会有所不同。

这可以像处理

1
2
3
4
5
6
if 'linux' in sys.platform:
    result = do_stuff_linux()
if 'sun' in sys.platform:
    result = do_stuff_solaris()
more_stuf(result)
...

然而,在整个代码中散布这些ifs似乎既麻烦又不合法。我还可以在一些dict中注册函数,然后通过dict调用函数。可能更好一些。

关于如何做到这一点有什么更好的想法吗?


解决方案1:

为需要复制和导入正确函数的每个函数创建单独的文件:

1
2
3
4
5
6
7
8
9
10
11
import sys
if 'linux' in sys.platform:
    from .linux import prepare, cook
elif 'sun' in sys.platform:
    from .sun import prepare, cook
else:
    raise RuntimeError("Unsupported operating system: {}".format(sys.platform))

dinner = prepare('pork')
drink_wine()
result = cook(dinner)

解决方案1.5:

如果您需要将所有内容保存在一个文件中,或者只是不喜欢条件导入,则可以始终为类似这样的函数创建别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys

def prepare_linux(ingredient):
    ...

def prepare_sun(ingredient):
    ...

def cook_linux(meal):
    ...

def cook_sun(meal):
    ...

if 'linux' in sys.platform:
    prepare = prepare_linux
    cook = cook_linux
elif 'sun' in sys.platform:
    prepare = prepare_sun
    cook = cook_sun
else:
    raise RuntimeError("Unsupported operating system: {}".format(sys.platform))

dinner = prepare('chicken')
drink_wine()
result = cook(dinner)


你可以这样做:

1
2
3
4
5
6
7
8
if 'linux' in sys.platform:
    def do_stuff():
        result = # do linux stuff
        more_stuff(result)
elif 'sun' in sys.platform:
    def do_stuff():
        result = # do solaris stuff
        more_stuff(result)

然后简单地调用do_stuff()