我正在使用构建系统(waf),它是python的包装器。有一些程序(perl脚本,exe等)调用python构建系统。当我从cmd.exe执行构建脚本时,我需要找到调用它的程序。我的操作系统是Windows 7.我尝试在python模块中获取父PID,并将“cmd”作为PPID返回,将“python.exe”作为PID返回,这样该方法无法帮助我找到我要查找的内容。
我相信我应该在操作系统级别上查看一些堆栈跟踪,但我无法找到如何操作。请帮助我采取我应采取的方法或可能的代码段。我只需要知道调用系统的脚本或程序的名称,例如caller.perl,callload.exe
谢谢
答案 0 :(得分: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
答案 1 :(得分:0)
修改python脚本以向其添加参数,说明调用它的文件。然后将其记录到记录器文件中。所有调用它的脚本都必须通过参数向量来识别python脚本。
例如:
foo.pl将yourfile.py称为:
yourfile.py /path/to/foo.pl
yourfile.py:
def main(argv):
logger.print(argv[1])
答案 2 :(得分:0)
我能够使用进程资源管理器来查看被调用的进程链,并且能够通过遍历父进程来检索名称。感谢所有回复的人。