Python:访问外部进程信息

标签 python python-2.7 process automation ui-automation

我正在尝试弄清楚如何使用 Python 管理 进程,尽管 C++ 可能更适合这个。我使用的是 Python 2.7Ubuntu 14.04 是我的操作系统。

我想要实现的目标的简历:

  • 向正在运行的进程发送 Action (不是信号)//与进程的用户界面交互
  • 读取内存地址值

我的意图是创建一个脚本来管理其他软件,类似于 Selenium 对浏览器所做的事情,但对任何程序都是如此。也许使用 Python 使用 subprocess 执行流程会让我选择管理流程 UI


发送操作/与正在运行的进程交互

现在我正在使用 psutil 在 Linux 中制作这个脚本。我知道有一些 Windows 库,例如 pywinpywindll

我想管理一个进程,例如任何一种带有 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/

相关文章:

python - Pandas MemoryError while pd.concat

python - 在函数内迭代

python - 无法使用 urllib2 从 Web 保存图像

安卓模拟器 : Easy way to simulate a process restart due to low memory?

ruby-on-rails - 停用的进程会阻止其他进程的正常运行吗?

perl - 在多个进程之间共享一个文件 [Perl]

python - 理论平均案例运行时复杂度为 `numpy.argmax()`

python - 治愈.cartview : avoid maximum xsize

python - 使用 python、selenium 和 pyvirtualdisplay 单击 Web 元素时遇到问题

python - MySQLDB 查询不返回所有行