2011-11-03 34 views
1

是的,我知道,但它是总结我想要做的唯一方法。如何“有条件地编译”python

为了打开一个串口我想用:

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

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

所以我真正想要的是让O_NONBLOCK消失或者让它为#define为0,这样我就可以在没有错误的情况下开展业务。

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

+0

只需尝试:使用'try:',捕获异常并使用支持的标志 –

+0

重新编辑:如果您在Python中询问有关条件编译和'#define's,您显然没有意识到完全扩展Python的评估模型,特别是动态性。 – delnan

+0

是的,“动态”可能仍在沉入。 – Thom

回答

3

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

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

这是最简单的方式为默认值可能不存在任何属性。

1

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

0

检查sys.platformos.name

0
  1. 你在做什么,你真的需要低层次的os.open API?在不支持O_NONBLOCK的操作系统上,您会做什么?如果后面的代码实际上并不依赖于你打开的O_NONBLOCK属性,那么这只是一个优化,或者是什么?

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

  3. 您可以申请EAFP。

例如:

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()) 
+0

1.读取串口。这是文档推荐的内容。说实话,我不确定为什么我需要O_NONBLOCK,因为虽然我发现它只是Unix的文档,但我没有发现它的含义。我假设它意味着不会阻止打开的I/O,我并不需要它,但是在我正在复制的代码中。 – Thom

2

你可以使用try/except块例如

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

portfd = os.open(portname, options) 

这是使用Python的方法,它容易要求原谅而不是权限。

+1

为什么-1?这是Pythonic的方式......但是,更好的做法是:尝试:nb = os.O_NONBLOCK;除了NameError:nb = 0; portfd = os.open(portname,os。O_RDWR | nb);'(不好意思,评论中没有格式化,但我相信你明白我的意思......) – glglgl