1

주 디렉토리의 하위 폴더 내에 여러 하위 스크립트를 실행하는 마스터 스크립트가 있습니다. MasterScript에서Python - 하위 폴더의 다른 스크립트에서 함수 실행

MyFolder\MasterScript.py 
MyFolder\ChildOneScript\ChildOne.py 
MyFolder\ChildTwoScript\ChildTwo.py 
MyFolder\ChildThreeScript\ChildThree.py 

, 내가 몇 가지 변수를 전달 "myChildFunction"& ChildOne에서 함수를 호출해야합니다

폴더 계층 구조는 같다. 문제는 내가 단순히 ChildOne의 상대 경로에 따라 다른 스크립트가 있기 때문에

import ChildOneScript.ChildOne as ChildOne 
ChildOne.myChildFunction 

할 수 없습니다 이다. 따라서 ChildOne을 MyFolder 디렉토리에있는 MasterScript에서 가져 와서 myChildFunction을 호출하면 다른 파일을 찾을 수 없다는 추적 오류가 발생합니다. 이것은 수동 작업이 많기 때문에 상대 경로 호출을 거부하는 또 다른 완고한 프로그래머의 실수 때문입니다.

그래서 내에서 MasterScript 내에서 myChildFunction을 호출하는 방법이 있습니까 은 일부 변수를 전달합니까?

subprocess.call을 사용할 수 있고 작업 디렉토리를 변경하기위한 cwd 인수가 있지만 특정 myChildFunction을 호출하고 subprocess를 사용하여 varaibles를 전달할 수 있는지를 알 수 없습니다.

편집 : 그것이 execfile를 사용하여 변수를 전달 할 수 있습니까?

답변

2

os 모듈을 사용하면 언제든지 해킹 할 수 있습니다. 그것은 꽤 아니지만 아마도 다른 모든 사람의 코드를 다시 작성하지 않고 할 수있는 최선의 방법 일 것입니다. 당신은 다른 스크립트에서 많은 기능을 사용하게 될 경우, 나는 그것이 더 쉽게 전화를 만들기 위해 그들을 위해 래퍼를 써서 :

import sys 
import os 

def call_legacy_func(func, *args, **opts): 
    prev = os.path.abspath(os.getcwd()) # Save the real cwd 
    try: 
     # Get the child's physical location. 
     func_path = sys.modules[func.__module__].__file__ 
    except: 
     # Die; we got passed a built-in function (no __file__) 
     # Or you could just call it, I guess: return func(*args, **opts) 
     return None 

    # Change to the expected directory and run the function. 
    os.chdir(func_path) 
    result = func(*args, **opts) 

    # Fix the cwd, and return. 
    os.chdir(prev) 
    return result 

import ChildOneScript.ChildOne as ChildOne 
call_legacy_func(ChildOne.myChildFunction, 0, 1, kwarg=False) 
+0

고맙습니다. 이것은 유망 해 보입니다. – Murkantilism

+0

대단히 고맙습니다. 더러운 해킹 일 수도 있지만 신이 작동합니다. 다시 한 번 감사드립니다! – Murkantilism

1

당신은 당신의 문제를 명확히 주시겠습니까? 특히, 폴더 레이아웃 및 하위 스크립트에서 가져 오는 것과 관련된 문제점이 무엇인지는 분명하지 않습니다. 나는 다음과 같은 디렉토리 구조를 작성하는 경우, 예를 들어

, 다음과 같이 __init__.py 단순히 빈 파일과 소스 파일입니다

/example 
    __init__.py 
    master.py 
    /childone 
     __init__.py 
     childone.py 
    /childtwo 
     __init__.py 
     childtwo.py 

있습니다

# master.py 
from childone.childone import childone_fxn 
from childtwo.childtwo import childtwo_fxn 

print "Calling child one" 
childone_fxn() 

print "Calling child two" 
childtwo_fxn() 

-

# childone.py 
def childone_fxn(): 
    print "hello from child one" 

-

def childtwo_fxn(): 
    print "hello from child two" 

/example 내에서 그때 master.py을 실행하고 얻을 것으로 예상 출력 할 수 있습니다 : 당신이 다른 실행 파일처럼 자식 스크립트를 처리하려면

example $ python master.py 
Calling child one 
hello from child one 
Calling child two 
hello from child two  

당신은 물론 서브 프로세스 모듈을 사용할 수 있습니다,하지만 난 할 수 왜 당신이 직접 하위 스크립트를 가져올 수 없어야하는지 알지 못합니다. 하지만 아마도 나는 당신의 질문을 오해하고 있습니다. ...

+0

예 ChildOne의 상대 경로에 의존하는 다른 스크립트가 있기 때문에 이것이 정상적으로 작동하는 이유는 알고 있지만 내 게시물에서 말했듯이 : "MasterScript에서 MyFolder 디렉토리로 ChildOne을 가져오고 myChildFunction 거기에 다른 파일을 찾을 수 없다는 추적 오류가 있습니다. 이것은 수동 작업이 많기 때문에 상대 경로 호출을 거부하는 또 다른 완고한 프로그래머의 실수 때문입니다. " 편집 : 명확히하기 위해 ChildOne이 호출하는 다른 디렉토리에는 ChildOne의 상대 경로에 의존하는 스크립트가 있습니다. – Murkantilism

+0

나는 아직도 혼란 스러울 것 같아요. 위에서 제공 한 예제는 경로를 바꾸지 않아도됩니다. 문제를 설명하기 위해 전체 MWE를 제공 할 수 있습니까? –

+0

그의 문제는'ChildOne'은 현재 Child 디렉토리가 현재 작업 디렉토리에 있다고 가정하는 상대 경로를 하드 코딩했습니다. 그래서 다른 곳에서'ChildOne'을 가져 와서 그것을 사용하려 할 때, 예상 한 곳에서 파일을 찾을 수 없기 때문에 죽기 시작합니다. –

관련 문제