-1

我正在使用一个构建系统(waf),它是 python 的包装器。有一些程序(perl 脚本、exe 等)调用 python 构建系统。当我从 cmd.exe 执行构建脚本时,我需要找出调用它的程序。我的操作系统是 Windows 7。我尝试在 python 模块中获取父 PID,它以 PPID 形式返回“cmd”,以 PID 形式返回“python.exe”,因此这种方法并不能帮助我找到我想要的东西。

我相信我应该在操作系统级别查看一些堆栈跟踪,但无法找到如何去做。请帮助我采用我应该采取的方法或可能的代码片段。我只需要知道调用系统的脚本或程序的名称,例如 caller.perl、callload.exe

谢谢

4

3 回答 3

2

虽然我不确定为什么需要它,但这本身就是一个有趣的问题,所以这里有一些提示,一旦你有父 PID 循环通过进程并获得名称,例如

使用 WMI

import wmi
c = wmi.WMI ()

for process in c.Win32_Process ():
    if process.ProcessId == ppid:
      print process.ProcessId, process.Name

我认为你可以使用 win32 API 做同样的事情,例如

processes = win32process.EnumProcesses()
for pid in processes:
    if pid == ppid:
       handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS,
False, pid)
       exe = win32process.GetModuleFileNameEx(handle, 0)  

当 progA 直接执行 progB 时,这将适用于简单的情况,但如果中间有很长的子进程链,则可能不是一个好的解决方案。通用案例的最佳方法是调用程序通过将其作为参数传递来告诉他的身份,例如

progB --calledfrom progA
于 2012-10-19T16:18:57.197 回答
0

修改 python 脚本,为其添加一个参数,说明调用它的文件。然后将其记录到记录器文件中。所有调用它的脚本都必须通过参数向量向 python 脚本标识自己。

例如:

foo.pl 调用 yourfile.py 为:

yourfile.py /path/to/foo.pl

你的文件.py:

def main(argv):
   logger.print(argv[1])
于 2012-10-19T15:59:28.273 回答
0

我能够使用进程资源管理器查看调用的进程链,并且能够通过遍历父进程来检索名称。感谢所有回复的人。

于 2012-10-23T13:17:14.663 回答