как мне сделать форк или неблокирующий системный вызов в python

Это связано с этот вопрос, но с другим подходом.

В Ubuntu я использую Autokey, который использует python для автоматизации наблюдаемых нажатий клавиш. Итак, у меня есть <super>+e для открытия Gedit, <shift>+<super>+3 для открытия OOwriter и т. д. Когда я делаю один из этих вызовов, я не могу сделать еще один, пока не завершится предыдущая вызванная программа.

Вот пример скрипта, который он выполняет:

import subprocess
subprocess.call("/opt/openoffice.org3/program/scalc")

... такое же поведение, используя:

import os
os.system("/opt/openoffice.org3/program/scalc")

Все это работало гладко в моем предыдущем Ubuntu 10.04LTS, но с тех пор все изменилось, и я не могу повторять эти вызовы.

Не могли бы вы помочь мне с ответвлением или сделать что-то, чтобы "вернуться" из этого subprocess.call(), не дожидаясь выхода программы? Я попробовал nohup и backgrounding /opt/openoffice.org3/program/scalc &, но они ничего не делают ( наверное что-то ломает в Autokey и Py)


Ответ: приведенный ниже ответ на самом деле не сработал, но заставил меня больше копаться и нашел другой ТАК ответьте, который сработал в моей ситуации!

#Enter script code -- mapped to <super>+e
import thread
thread.start_new_thread(os.system,('gedit',))

Это полностью сработало! Я могу нажать <super>+e 2 или 3 раза подряд, и он продолжает добавлять вкладки в gedit. :) Этот скрипт заставляет Autokey действовать так, как будто команда в кавычках набирается в командной строке.


person Chris K    schedule 16.06.2012    source источник


Ответы (1)


Это так же просто, как использовать Popen вместо call:

import subprocess
subprocess.Popen("/opt/openoffice.org3/program/scalc")

call никогда не должен был работать таким образом, поскольку он должен возвращать код выхода, а это означает, что программа действительно должна завершиться.

person Dan    schedule 16.06.2012