Как получить имя вызывающего скрипта

#python #bash #python-2.7

#python #файл

Вопрос:

Я использую 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 параметр с именем первого скрипта, потому что у меня есть тонны вызываемых / вызывающих скриптов, и я не могу провести рефакторинг всего кода.

Есть идеи?

Комментарии:

1. Я не думаю, что это возможно, когда вы используете os.system . По сути, вы проходите через ОС и вызываете новый сеанс python. Вы можете настроить некоторую переменную среды в outer.py , при вызове system с ее именем, и проверить ее наличие inner.py . Я не думаю, что есть какие-либо другие обходные пути.

2. Если вы планируете заставлять inner.py делать разные вещи в зависимости от того, кто его вызывает, это будет кошмар обслуживания.

Ответ №1:

Одна из идей — использовать psutil.

 #!env/bin/python
import psutil

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

Это, конечно, зависит от того, как вы начинаете outer.py .
Это решение не зависит от операционной системы.

Ответ №2:

В Linux вы можете получить идентификатор процесса, а затем имя вызывающего абонента следующим образом.

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
Я полагаю, вы можете делать аналогичные вещи и в других ОС.

Ответ №3:

Другая, немного более короткая версия только для unix

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

Ответ №4:

Если это применимо к вашей ситуации, вы также можете просто передать аргумент, который позволяет 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