如何获取调用脚本的名称

9 投票
4 回答
9085 浏览
提问于 2025-04-18 09:05

我正在使用 Python 2.7.6,并且有两个脚本:

第一个脚本是 outer.py

import sys
import os

print "Outer file launching..."
os.system('inner.py')

它会调用第二个脚本 inner.py:

import sys
import os

print "[CALLER GOES HERE]"

我希望第二个脚本(inner.py)能够打印出调用它的脚本的名字(也就是 outer.py)。

我不能把第一个脚本的名字作为参数传给 inner.py,因为我有很多这样的调用和被调用的脚本,没办法把所有的代码都改一遍。

有没有什么好主意呢?

4 个回答

-1

如果你的情况适用,你可以简单地传递一个参数,这样inner.py就能区分不同的情况:

import sys
import os

print "Outer file launching..."
os.system('inner.py launcher')

innter.py

import sys
import os

try:
    if sys.argv[0] == 'launcher':
        print 'outer.py called us'
except:
    pass
1

这是一个稍微简短一点的版本,仅适用于Unix系统

import os
parent = os.system('readlink -f /proc/%d/exe' % os.getppid())
5

在Linux系统中,你可以先获取进程的ID,然后再找到调用者的名字,方法如下。

这是一个名为 p1.py 的文件:

import os
os.system('python p2.py')

这是另一个名为 p2.py 的文件:

import os

pid = os.getppid()
cmd = open('/proc/%d/cmdline' % (pid,)).read()
caller = ' '.join(cmd.split(' ')[1:])
print caller

运行 python p1.py 这个命令会得到 p1.py 的名字。我想在其他操作系统中也可以做类似的事情。

9

一个想法是使用 psutil 这个库。

#!env/bin/python
import psutil

me = psutil.Process()
parent = psutil.Process(me.ppid())
grandparent = psutil.Process(parent.ppid())
print grandparent.cmdline()

当然,这个方法取决于你是怎么启动 outer.py 这个文件的。这个解决方案和操作系统无关。

撰写回答