#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