как «условно скомпилировать» питон

1

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

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

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

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

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

Есть идеи?

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

  • 0
    просто попробуйте: используйте try: поймайте исключение и используйте поддерживаемый флаг
  • 0
    Повторное редактирование: если вы спрашиваете об условной компиляции и #define s в Python, вы явно не понимаете полного расширения модели оценки Python, в частности динамичности.
Показать ещё 1 комментарий
Теги:

5 ответов

3
Лучший ответ

Другой метод, который никто еще не предложил:

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

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

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 способ ... лучше было бы, однако, сделать это try: nb = os.O_NONBLOCK; except NameError: nb = 0; portfd = os.open(portname, os.O_RDWR | nb); (плохо, что в комментариях нет форматирования, но я уверен, что вы понимаете, о чем я ...)
1

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

0
  1. Что вы делаете, что вам действительно нужен низкоуровневый API os.open? Что вы собираетесь делать в ОС, которая не поддерживает O_NONBLOCK? Если последующий код фактически не зависит от свойства O_NONBLOCK того, что вы открываете, то это просто оптимизация или что?

  2. Вы можете проверить среду, os.name строку 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, я не нахожу никаких документов о том, что это значит. Я предполагаю, что это означает, что не блокируйте ввод / вывод для open, который мне не нужен, но был в коде, который я копирую.
0

Проверьте sys.platform или os.name.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню