我在这里看到过类似的问题,但我没有得到答案。也许是因为我对这一切都不熟悉,只是不明白。我希望我的应用程序主要用作指示器。如果用户再次启动它,它会检查它是否已在运行,如果是,则将所有输入数据提供给该进程并退出。
- 所以首先我需要检查它是否正在运行。我看到的答案是,你可以在程序启动时创建一个文件,然后检查它是否存在...但如果有人删除它怎么办?我不能直接询问操作系统是否有名为“myApp”的进程吗?
- 接下来我不太明白的是如何与进程通信。我如何给它输入数据,它会用这些数据做什么?它是否像通过 main() 方法启动新应用程序一样工作?
我正在尝试使用 Quickly 创建它。所以如果你能给我一些 Python 示例或类似内容的链接就太好了。
答案1
实际上有一个名为 python-psutil 的包可以使用 python 代码提供进程信息。
你可以在这里获取包裹http://packages.ubuntu.com/lucid/python-psutil
还有另一个有用的包,名为防扩散安全倡议
PSI 是一个 Python 包,可实时访问进程和其他杂项系统信息,例如架构、启动时间和文件系统。它有一个 Python 风格的 API,该 API 在所有受支持的平台上都一致,但也会在需要时公开特定于平台的详细信息。
更多信息请点击这里:https://bitbucket.org/chrismiles/psi/wiki/Home
另一个链接:https://stackoverflow.com/questions/2703640/process-list-on-linux-via-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...