如何“有条件地编译”python

时间:2011-11-03 13:57:15

标签: python windows

是的,我知道,但这是总结我想做的事情的唯一方法。

打开我想要使用的串口:

    portfd = os.open(portname, os.O_RDWR | os.O_NONBLOCK)

问题是Windows下不存在O_NONBLOCK,这意味着它会在这里爆炸。我正在Windows下进行测试,以便在支持非阻止的操作系统下进行部署。

所以我真正想要的是让O_NONBLOCK消失或者为Windows环境设置#defined为0,以便我可以在没有错误的情况下开展业务。

有什么想法吗?

PS:请不要解释python如何编译/解释。我明白了,但我正在尝试传达一个想法。

5 个答案:

答案 0 :(得分:4)

还没有人建议的另一种方法:

portfd = os.open(portname, os.O_RDWR | getattr(os, 'O_NONBLOCK', 0))

这是默认任何可能不存在的属性的简便方法。

答案 1 :(得分:2)

您可以使用try / except块,例如

try:
    options = os.O_RDWR | os.O_NONBLOCK
except NameError:
    options = os.O_RDWR

portfd = os.open(portname, options)

这是使用Python方法,它更容易请求宽恕而不是许可。

答案 2 :(得分:1)

显然没有编译时/运行时区别。你可以做的是检查sys.platform的值。

答案 3 :(得分:0)

检查sys.platformos.name

答案 4 :(得分:0)

  1. 你在做什么才真正需要低级os.open API?在不支持O_NONBLOCK的操作系统上你打算做什么?如果后续代码实际上并不依赖于你打开的O_NONBLOCK属性,那么这只是一个优化,还是什么?

  2. 您可以通过检查os.name字符串来检查环境。

  3. 您可以申请EAFP。

  4. 例如:

    def file_mode_for_funky_special_purpose():
        try: return os.O_RDWR | os.O_NONBLOCK
        except AttributeError: return # whatever it is that you want for other systems
    
    portfd = os.open(portname, file_mode_for_funky_special_purpose())