Как работать с процессами?
Я видел подобные вопросы здесь, но я не получил свой ответ. Может быть, это потому, что я новичок во всем этом и просто не понимаю. Я хочу, чтобы мое приложение работало в основном как индикатор. И если пользователь запустит его снова, он проверит, запущен ли он, если это так, затем передаст все входные данные этому процессу и выйдет.
- Итак, сначала мне нужно проверить, работает ли он. Я видел ответ, где вы можете создать файл-ведьму при запуске программы, а затем проверить, существует ли он... Но что, если кто-то его удалит? Разве я не могу просто спросить у ОС, есть ли процесс с именем "myApp" или что-то в этом роде?
- Следующее, что я не понимаю, это как общаться с процессом. Как мне дать ему входные данные и что он будет с этим делать? Работает ли это так же, как запуск нового приложения через метод main()?
Я пытаюсь создать это с помощью Quickly. Так что было бы неплохо, если бы вы могли дать мне несколько примеров Python или ссылку на что-то подобное.
2 ответа
Я узнал, что мне действительно нужен DBus для достижения того, что мне нужно. Итак, вот что мне действительно нужно было сделать:
- Проверьте, работает ли мой сервис на dbus
- Если это так, передайте все мои входные переменные и выйдите
- если это не создать мой сервис dbus и запустить мою программу
в Python это будет выглядеть примерно так:
# using quickly...
#
# __init__.py
# # # # # # # # # # # # #
import dbus
import sys
from gi.repository import Gtk
# import whatever else you need...
from my_app import MyAppDBusService
# import whatever else from your app...
def main():
bus = dbus.SessionBus()
# Check if my app is running and providing DBus service
if bus.name_has_owner('com.example.myApp'):
#if it is running pass the commandline variables to it and exit
#get my service from DBus
myService = bus.get_object('com.example.myApp', '/com/example/myApp')
#get offered method from DBus
myMethod = myService.get_dbus_method('my_method', 'com.example.myApp')
#call the method and pass comandline varialbes
myMethod(sys.argv)
#exit
sys.exit(0)
else:
#if not running
#run my DBus service by creating MyAppDBusService instance
MyAppDBusService.MyAppDBusService()
#do whatever with sys.argv...
#...
Gtk.main()
# MyAppDBusService.py
# # # # # # # # # # # # # #
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
#import whatever else you need...
# use the dbus mainloop
DBusGMainLoop(set_as_default = True)
class MyAppDBusService(dbus.service.Object):
def __init__(self):
# create dbus service in the SessionBus()
dbus_name = dbus.service.BusName('com.example.myApp', bus=dbus.SessionBus())
dbus.service.Object.__init__(self, dbus_name, '/com/example/myApp')
# offer a method to call using my dbus service
@dbus.service.method('com.example.myApp')
def my_method(self, argv):
#do whatever with argv...
На самом деле существует пакет с именем python-psutil для предоставления информации о процессе с использованием кодов python.
вы можете получить пакет здесь http://packages.ubuntu.com/lucid/python-psutil
Есть еще один полезный пакет для вас, названный PSI
PSI - это пакет Python, обеспечивающий доступ в реальном времени к процессам и другой различной системной информации, такой как архитектура, время загрузки и файловые системы. Он имеет pythonic API, который является единым для всех поддерживаемых платформ, но также раскрывает детали для конкретной платформы, где это желательно.
Более подробная информация здесь: https://bitbucket.org/chrismiles/psi/wiki/Home
еще одна ссылка: https://stackoverflow.com/questions/2703640/process-list-on-linux-via-python