#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:
-
Что вы делаете, что вам действительно нужен низкоуровневый
os.open
API? Что вы собираетесь делать в ОС, которая не поддерживает O_NONBLOCK? Если последующий код на самом деле не зависит от свойства O_NONBLOCK того, что вы открываете, то это просто оптимизация или что? -
Вы можете проверить среду, изучив
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())
Комментарии:
1. 1. Считывание последовательного порта. Это то, что рекомендуют документы. Честно говоря, я не совсем уверен, зачем мне нужен O_NONBLOCK, потому что, хотя я нахожу документацию о том, что это только Unix, я не нахожу документов о том, что это значит. Я предполагаю, что это означает, что не блокируйте ввод-вывод для open, который мне на самом деле не нужен, но был в коде, который я копирую.