Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要找到称为python脚本的程序_Python_Windows_Stack Trace - Fatal编程技术网

需要找到称为python脚本的程序

需要找到称为python脚本的程序,python,windows,stack-trace,Python,Windows,Stack Trace,我使用的是构建系统(waf),它是python的包装器。有一些程序(perl脚本、exe等)调用python构建系统。当我从cmd.exe执行构建脚本时,我需要找出调用它的程序。我的操作系统是Windows7。我尝试在python模块中获取父PID,它将“cmd”作为PPID返回,“python.exe”作为PID返回,因此这种方法无法帮助我找到所需的内容 我相信我应该在操作系统级别上查看一些stacktraces,但我无法找到如何做到这一点。请帮助我,我应该采取的方法或一个可能的代码片段。我只

我使用的是构建系统(waf),它是python的包装器。有一些程序(perl脚本、exe等)调用python构建系统。当我从cmd.exe执行构建脚本时,我需要找出调用它的程序。我的操作系统是Windows7。我尝试在python模块中获取父PID,它将“cmd”作为PPID返回,“python.exe”作为PID返回,因此这种方法无法帮助我找到所需的内容

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


谢谢

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

例如:

foo.pl将yourfile.py调用为:

yourfile.py /path/to/foo.pl
yourfile.py:

def main(argv):
   logger.print(argv[1])

虽然我不知道为什么需要它,但这本身就是一个有趣的问题,所以这里有一些提示,一旦您有了父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

我能够使用process explorer查看调用的进程链,并且能够通过遍历父进程来检索名称。谢谢所有的回复

如果你的程序需要根据运行它的人做一些不同的事情。。。你可能做错了。只是通过一个论点说你想要它做什么。我很好奇你为什么需要这个?可能是X/Y问题。需要这个来获取诸如哪些脚本调用了构建等数据。这将返回“cmd.exe”作为名称。我正在寻找在该命令窗口中运行的实际程序名。@user1759821为什么返回cmd.exe,不是cmd.exe的祖父吗?在我的命令窗口中,我有c:\something.exe/command“c:\Python\Python waf-j1 proj”进程分叉的顺序是explorer->cmd.exe->cmd.exe->Python.exe->Python.exe。因此,在我们的例子中,我们的父母和祖父是“cmd.exe”。因此,遵循这个链,对于一般情况来说,这可能是一个徒劳的练习,这就是为什么更好的方法是调用程序通过在我的命令窗口中以argumeny的形式传递它来告诉他的身份,我有c:\something.exe/command“c:\Python\Python waf-j1 proj”这将不起作用,因为进程分叉的顺序是explorer->cmd.exe->cmd.exe->python.exe。由于没有源代码,我只能在something.exe中进行任何更改,除非必要,我也只能在wscript(waf)中进行更改。