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

#python #windows

#python #Windows

Вопрос:

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

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

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

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

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

Есть идеи?

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

Комментарии:

1. просто попробуйте: используйте try: , перехватите исключение и используйте поддерживаемый флаг

2. Повторное редактирование: если вы спрашиваете об условной компиляции и #define s в Python, вы явно не понимаете полного расширения модели оценки Python, в частности динамичности.

3. да, «динамичность», вероятно, все еще снижается.

Ответ №1:

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

 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); (плохо, что в комментариях нет форматирования, но я уверен, вы понимаете, что я имею в виду …)

Ответ №3:

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

Ответ №4:

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

Ответ №5:

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

Комментарии:

1. 1. Считывание последовательного порта. Это то, что рекомендуют документы. Честно говоря, я не совсем уверен, зачем мне нужен O_NONBLOCK, потому что, хотя я нахожу документацию о том, что это только Unix, я не нахожу документов о том, что это значит. Я предполагаю, что это означает, что не блокируйте ввод-вывод для open, который мне на самом деле не нужен, но был в коде, который я копирую.