как "условно компилировать" питон - PullRequest
1 голос
/ 03 ноября 2011

Да, я знаю, но это был единственный способ обобщить то, что я хочу сделать.

Для открытия последовательного порта я хочу использовать:

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

Проблема в том, чтоO_NONBLOCK не существует под окнами, что означает, что он взрывается здесь.Я тестирую в Windows для развертывания в ОС, которая поддерживает неблокирование.

Так что я действительно хочу, чтобы O_NONBLOCK исчез, или чтобы он был #defined для среды Windows с 0, чтобы я мог перейтио моем бизнесе без ошибок.

Есть идеи?

PS: Пожалуйста, не объясните, как Python компилирует / интерпретирует.Я понимаю, но пытаюсь донести идею.

Ответы [ 5 ]

4 голосов
/ 03 ноября 2011

Еще один метод, который еще никто не предлагал:

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

Это простой способ установить по умолчанию любой атрибут, который может не существовать.

2 голосов
/ 03 ноября 2011

Вы можете использовать блок try / кроме, например,

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

portfd = os.open(portname, options)

Это использует подход Python, который проще просить прощения, чем разрешения.

1 голос
/ 03 ноября 2011

Очевидно, что нет различий времени компиляции / времени выполнения. Что вы можете сделать, это проверить значение sys.platform.

0 голосов
/ 03 ноября 2011
  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 голосов
/ 03 ноября 2011

Чек sys.platform или os.name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...