Используйте модуль subprocess
, доступный на Python 2.4+, а не os.system()
, поэтому вам не нужно иметь дело с экранированием оболочки.
import subprocess, os
if sys.platform.startswith('darwin'):
subprocess.call(('open', filepath))
elif os.name == 'nt':
os.startfile(filepath)
elif os.name == 'posix':
subprocess.call(('xdg-open', filepath))
Двойные круглые скобки связаны с тем, что subprocess.call()
хочет, чтобы в качестве первого аргумента была последовательность, поэтому мы используем кортеж здесь. В Linux-системах с Gnome есть также команда gnome-open
, которая делает то же самое, но xdg-open
является стандартом Free Desktop Foundation и работает в среде рабочего стола Linux.
Спасибо за номинальное животное за информацию.
Я отслеживаю Linux 2.0 ( https://mirrors.edge.kernel.org/pub/linux/kernel/v2.0/ ), возможно, дело немного в другом. Извините, я не могу найти сетевой источник Linux 2.0 для ссылки.
Для клавиатуры, в текстовом режиме, я думаю, что никто не вызывает 'open' в ядре. В 'int tty_init (void)' (tty_io.c) он будет вызывать 'kbd_init (); тогда мы можем видеть:
request_irq(KEYBOARD_IRQ, keyboard_interrupt, 0, "keyboard", NULL);
, поэтому клавиатура HW может работать с этим IRQ & amp; обратный вызов ('key_interrupt').
Для tty_open () я, наконец, вижу его в main.c
open("/dev/tty1",O_RDWR,0);
Для более новой версии ядра, я думаю, что эта часть перенесена в приложение getty, поэтому я не могу найти его в источник ядра.
Когда я проверяю CentOS 7, только текстовый режим, в VirtualBox я не вижу X после выполнения lsof / dev / input / event2 (клавиатура), но моя клавиатура все еще работает
blockquote>Это потому, что вы используете виртуальную консоль , а затем одно из
/dev/ttyN
устройств. Они напрямую связаны с подсистемой входных событий Linux внутри самого ядра (с помощью модуляvt
); по существу, все клавиатурные устройства действуют как входы для активного в данный момент виртуального терминала.Сам X использует виртуальную консоль, просто чтобы ядро могло переключаться между ней и любыми текстовыми виртуальными консолями.
Как насчет
blockquote>tty_open()
?Если вы запустите
sudo lsof /dev/tty[0-9]
, вы увидите, какие процессы обращаются к виртуальной консоли.Процессы с
getty
в названии являются теми, которые предоставляют терминалы входа. (Те, которые используются с последовательными терминалами, очень похожи; на самом деле, многие программы getty могут нормально обрабатывать как виртуальные консоли, так и последовательные терминалы.) Когда вы входите в систему, этот getty запускаетlogin
(программа!), Которая, в свою очередь, запускает оболочку по умолчанию, определенную для этого пользователя (см.getent passwd username
; это последнее поле, и оно должно быть тем, которое указано в/etc/shells
, чтобы быть разрешенным).Само ядро поддерживает переключение на другую виртуальную консоль с помощью Ctrl kbd> + Alt kbd> + Fn kbd> (F1 для tty1, F2 для tty2 и скоро). Если вы используете подходящие графические драйверы, вы даже можете переключаться между Xorg и виртуальными консолями. (Обычно Xorg запускается на tty6 или tty7, но это зависит от дистрибутива.) Ctrl kbd> + Alt kbd> + ← kbd> и > Ctrl kbd> + Alt kbd> + → kbd> также обычно можно использовать для переключения на предыдущую или следующую виртуальную консоль.
tty_
* подпрограммы являются аппаратно-независимым кодом UNIX для реализации интерфейса терминала в ядре. Они отвечают за дисциплины tty, управление работой и обработку символов в линейном режиме (включая генерацию сигналов, например, на Ctrl-C
). Они также реализуют интерфейс для пар tty / pty и т. П.
Это обычный код для включения всех общих функций драйверов терминала в любое оборудование, к которому вы можете подключиться (консольная клавиатура / дисплей - только один пример, но у вас есть, по крайней мере, интерфейсы uart RS-232C, USB последовательные ключи, последовательные мультиплексоры PCI и т. д.)
Функциональность терминала появилась в древней версии Unix v7 и имеет множество улучшений, связанных с BSD Unix (например, управление заданиями)
Кстати, linux реализация последовательного интерфейса не очень хороша, вам стоит посмотреть на реализацию BSD.