2014-06-24 2 views
2
나는 스크립트가

:가져 오기 파이썬 스크립트

moving1.py :

def move(): 
    print("walk!") 

moving2.py :

def move(): 
    print("run!") 

그리고 man.py, 그 인수 매개 변수 moving1 또는 moving2 스크립트가 작동하도록 허용 할 수 있습니다.

man.py :

이제
import sys 

if len(sys.argv) <= 1: 
    exit("Too less arguments calling script") 

__import__(sys.argv[1]) 
moving = sys.modules[sys.argv[1]] 

def move(): 
    moving.move() 

나는이 man.py 실행의 모든 ​​변종 테스트해야 testman.py 스크립트 :

testman.py을

import man #and somehow add here as argument "moving1" 
man.move() 

import man #and somehow add here as argument "moving2" 
man.move() 

비슷한 질문이 많이 있지만 꼭 원하는 것은 아닙니다. 가져온 스크립트에 인수를 추가하려면 어떻게해야합니까? 문제가 확인되지 않습니다

if __name__ = "__main__": 

거기에 문제가 정확하게 내가 원하는 매개 변수를 사용하여 스크립트를 가져 오는 것입니다. 가능한가?

+0

"예외는 구식 클래스 여야하며 유니 코드가 아닌 BaseException에서 파생되어야합니다." –

+0

Thx는 고정되어 있습니다. – Arkady

+0

왜 이러한 구분이 존재합니까? 동일한 파일에 함수를 포함하고 명령 행 인수를 함수에 매핑하는 것이 훨씬 쉬울 것입니다. – msvalkon

답변

2

당신은 당신의 인수 처리 코드 및 가져 오기 코드를 분리해야합니다

man.py을 testman.py이

import man 
man.setup(<name>) 
man.move() 

그러나, 이것은 것 같다

import sys 

def move(): 
    moving.move() 

def setup(module): 
    global moving 
    moving = __import__(module) 

if __name__ == "__main__": 
    if len(sys.argv) <= 1: 
     exit("Too less arguments calling script") 

    setup(sys.argv[1]) 

당신이하려고하는 것을 실현시키는 아주 이상한 방법이 있습니다. 아마도 당신의 목표를 명확히 할 수 있을까요?

+0

작동하지 않습니다. "import man"행에는 예외가 없으므로 Exception이 발생합니다. – Arkady

+0

웁스! 모든 인수 처리 코드를 이동하는 것을 의미합니다 ... 고정! –

+0

인수를 가져온 스크립트의 매개 변수를 구문 분석하여 달성 할 수있는 방법이 없으면 사용합니다. 감사합니다. – Arkady

2

filename을 명령 줄 인수로 사용하고 가져올 경우, imp load_source 모듈을 사용하십시오.

import imp 
module = imp.load_source("module.name", sys.argv[1]) 
#Then call the function 
module.move() 

기본적으로 imp 모듈은 런타임에 모듈을로드하는 데 도움이됩니다.

희망이 도움이됩니다.

+0

고마워요.하지만이 방법으로 testman.py를 수정하면 import imp man = imp.load_source ("man", "moves1") 그런 다음 작동하지 않습니다. "파일을 찾을 수 없습니다". ".py"를 추가하면. 여전히 "man.py"를 찾지 못했고 오류가 발생했습니다 : moving1.py:4 : RuntimeWarning : 부모 모듈 'man'이 절대 가져 오기를 처리하는 동안 찾을 수 없습니다. 가져 오기 로깅 – Arkady

+0

@Arkady os.path.dirname (os.path.abspath (__ file__))을 추가하더라도 파일의 절대 경로 (현재 작업 디렉토리를 추가하거나 \ _ \ _ FILE \ _ \ _에서 경로 가져 오기)를 load_source – user2109788

+0

으로 전달하십시오. 파일 이름은 여전히 ​​문제가 있습니다. 그것은 "가져 오기 로깅"을위한 절대 경로를 원하는 것처럼 보입니다 ... – Arkady