Да, я знаю, но это был единственный способ обобщить то, что я хочу сделать.
Для открытия последовательного порта я хочу использовать:
portfd = os.open(portname, os.O_RDWR | os.O_NONBLOCK)
Проблема в том, что O_NONBLOCK не существует под окнами, что означает, что он взрывается здесь. Я тестирую под Windows для развертывания под ОС, которая поддерживает неблокирование.
Так что я действительно хочу, чтобы O_NONBLOCK ушел или у него #defined для среды Windows с 0, чтобы я мог заниматься своим делом без ошибки.
Есть идеи?
PS: Пожалуйста, не объясняйте, как компилирует/интерпретирует python. Я понял, но я пытаюсь сообщить идею.
Другой метод, который никто еще не предложил:
portfd = os.open(portname, os.O_RDWR | getattr(os, 'O_NONBLOCK', 0))
Это простой способ по умолчанию использовать любой атрибут, который может не существовать.
Вы можете использовать блок try/except, например
try:
options = os.O_RDWR | os.O_NONBLOCK
except NameError:
options = os.O_RDWR
portfd = os.open(portname, options)
Это использует подход Python, который проще просить прощения, чем разрешения.
try: nb = os.O_NONBLOCK; except NameError: nb = 0; portfd = os.open(portname, os.O_RDWR | nb);
(плохо, что в комментариях нет форматирования, но я уверен, что вы понимаете, о чем я ...)
Очевидно, что нет времени компиляции/времени выполнения. Что вы можете сделать, так это проверить значение sys.platform
.
Что вы делаете, что вам действительно нужен низкоуровневый API os.open
? Что вы собираетесь делать в ОС, которая не поддерживает O_NONBLOCK? Если последующий код фактически не зависит от свойства O_NONBLOCK того, что вы открываете, то это просто оптимизация или что?
Вы можете проверить среду, os.name
строку os.name
.
Вы можете применить 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())
Проверьте sys.platform
или os.name
.
try:
поймайте исключение и используйте поддерживаемый флаг#define
s в Python, вы явно не понимаете полного расширения модели оценки Python, в частности динамичности.