2014-06-09 2 views
1

내가 파이썬 2.7.6를 사용하고 있는데 나는 두 개의 스크립트가 얻는 방법 : inner.py 호출발신자 스크립트 이름

outer.py

import sys 
import os 

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

:

import sys 
import os 

print "[CALLER GOES HERE]" 

을 두 번째 스크립트 (inner.py)에서 호출자 스크립트 (outer.py)의 이름을 인쇄하고 싶습니다. 나는 called/caller 스크립트가 많고 모든 코드를 리팩토링 할 수 없으므로 첫 번째 스크립트의 이름이있는 매개 변수를 inner.py에 전달할 수 없습니다.

아이디어가 있으십니까?

감사합니다, 리눅스에 지안루카

+0

이 가능합니다 os.system'. 근본적으로 os를 거쳐 새로운 파이썬 세션을 호출합니다. 'inner.py'에서'system'을 호출 할 때 환경 변수를 설정하고'inner.py'에서 그 변수의 존재를 검사 할 수 있습니다. 나는 다른 해결 방법이 있다고 생각하지 않는다. – luk32

+0

'inner.py'를 누가 호출하는지에 따라 다른 것을 할 계획이라면, 그것은 유지 보수의 악몽이 될 것입니다. – user2357112

답변

1

당신과 같이 프로세스 ID 후 발신자 이름을 얻을 수 있습니다.

p1.py

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

p2.py 난 당신이뿐만 아니라 다른 OS에서 유사한 일을 할 수 상상 p1.py 을 얻을 것입니다 python p1.py를 실행

import os 

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

.

2

하나의 아이디어는 psutil을 사용하는 것입니다.

#!env/bin/python 
import psutil 

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

이것은 outer.py를 시작한 방법과 관계가 있습니다. 이 솔루션은 독립적입니다.

0

상황에 적용 할 수있는 당신은 또한 단순히 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 
당신이`사용할 때 나는 생각하지 않는다