我正在尝试弄清楚如何使用 Python 管理 进程,尽管 C++ 可能更适合这个。我使用的是 Python 2.7,Ubuntu 14.04 是我的操作系统。
我想要实现的目标的简历:
- 向正在运行的进程发送 Action (不是信号)//与进程的用户界面交互
- 读取内存地址值
我的意图是创建一个脚本来管理其他软件,类似于 Selenium 对浏览器所做的事情,但对任何程序都是如此。也许使用 Python 使用 subprocess 执行流程会让我选择管理流程 UI
发送操作/与正在运行的进程交互
现在我正在使用 psutil
在 Linux 中制作这个脚本。我知道有一些 Windows 库,例如 pywin
或 pywindll
。
我想管理一个进程,例如任何一种带有 UI 的软件(Skype、Gedit、Firefox..),我想知道是否可以发送一个 Action 来点击按钮。
我不想管理计算机中的鼠标,因为假设这个窗口“隐藏”在其他窗口/东西下面:
- 一旦我在我的脚本中设置了将点击发送到 UI 按钮的过程,是否有可能? (或写入一些文本框)
我正在使用 psutil
来获取进程,我有很多选项,例如:
- 获取内存映射
- 获取进程的线程
- 终止进程
- CPU 使用率
- 等等
但是这些 Action 似乎都不是我要找的,那就是与进程UI交互...
我什至有可能实现我想要实现的目标吗?
发送击键和鼠标点击的最简单解决方案是什么?
读取内存地址值
我一直在 Linux 中使用 scanmem
来查找某个变量的内存地址,一旦找到我要查找的内存地址,我想在 Python 中使用该地址获取存储在该地址中的值。
我发现最接近的是使用 ctypes
,类似于:
from ctypes import string_at
from sys import getsizeof
mem_address = 0x7c3f
value = string_at(id(mem_address), getsizeof(mem_address))
- 这是在 Python 中访问内存地址的最简单方法吗?
- 是否可以实时修改/更新这个数字?
- 如何用 IU 识别内存地址?
我在想一个程序在执行时必须将程序的用户界面发送到操作系统,是否有可能“捕获” python 的接口(interface),并重定向到操作系统?
类似于通过 Python 执行软件,因此可以直接管理 UI
最佳答案
我喜欢你的想法 :D UI 自动化很棒
关于这个问题本身,据我所知,所有可以与进程的 GUI 交互的软件都是基于计算机视觉的 OCR 或读取内存来获取 UI 的对象模型。后者可能并不通用,因为不同的小部件工具包和构建 UI 的方法将具有不同的底层模型——它可能比 CV+OCR 更麻烦。
如果您想查看一些已经为此目的制作的东西,请查看 wikpedia list .您已经知道 Selenium,但还有更多 - AutoIt 和 Sikuli,我在其中检查了我想用 python 制作的类似项目。 (AutoIt 是 BASIC-like -YUCK- 和 windows-only 但 Sikuli 似乎与 python 相关并且是跨平台的 - 我很久以前检查过它们所以我不记得细节)。
真正的好消息是 python 有非常好的 CV 和 OCR 模块。我个人的推荐是simplecv它可以环绕 opencv 和其他 cv 软件,虽然我没有推荐的 OCR 模块,但我喜欢 python-tesseract在我寻找模块时最多。
方法通常是拍摄 GUI 的快照(graphicsmagick 可以很好地做到这一点,并且有一个 python 包装器),用 CV 找出元素的位置,用 OCR 读取标签,这样你就可以得到一个窗口上的模型。然后,根据脚本在 GUI 上的位置,为脚本提供有关做什么和何时做的指令。由于 python 可以发送鼠标和键盘事件,所以你很幸运。您甚至可以使用 minidom
模块为您的代码创建一个更简单的对象模型。
顺便说一句,CV+OCR 方法也被《炉石传说》相关的应用程序使用,该应用程序拍摄游戏快照并读取分数,然后为玩家跟踪分数,以便他们可以构成指标。这是一种比看起来更轻量级和更简单的方法 - 我检查了代码,它非常容易理解,尽管它背后有重量级技术。
关于Python:访问外部进程信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25783655/