복붙노트

[PYTHON] 다른 파이썬 스크립트 파일 내부의 인자로 파이썬 스크립트 파일을 실행하는 법

PYTHON

다른 파이썬 스크립트 파일 내부의 인자로 파이썬 스크립트 파일을 실행하는 법

내 문제는 반환 된 값을 얻으려면 다른 파이썬 파일 내부에서 인수로 파이썬 파일을 실행하려면 ....

내가 잘 설명했는지 모르겠다.

예:

쉘에서 나는 이것을 실행한다.

          getCameras.py "path_to_the_scene"

그리고 이것은 나에게 카메라의 목록을 돌려 준다 ....

그래서 어떻게 다른 스크립트에서이 스크립트 (인수 포함)를 호출 할 수 있습니까 ???

나는 여기에 다른 질문을 읽어서 혼자서 알아 내려고 노력했지만 execfile () 함수를 사용해야합니까? 얼마나 정확하게?

나 같은 초보자를 도와 주셔서 미리 감사드립니다 !!

좋아, 답변을 살펴본 후, 좀 더 간결하게하기 위해 질문을 편집해야하며, 일부 답변을 이해할 수 없기 때문에 (미안, 내가 초보자라고 말한 것처럼 !!!) :

글쎄, 나는이 2 개의 스크립트 "getMayaCameras.py"와 "doRender.py"그리고 GUI의 처음 2 개의 스크립트를 구현하는 "renderUI.py"라고 부른다.

"getMayaCameras.py"와 "doRender.py"는 모두 인수 (또는 "doRender.py"의 경우 플래그)를 추가하여 시스템 쉘에서 직접 실행할 수있는 scipt이며, 가능하면 할 수 있습니다. 여전히이 posibility 데 그래서 내가 UI를 실행하거나 쉘에서 스크립트를 dirctly 실행 선택할 수 있습니다

"renderUI.py"스크립트에서 가져 오기 작업을 위해 이미 일부 수정 작업을 수행했지만 이제는 스스로 작동하지 않습니다.

그래서이 스크립트는 스스로 작동하고 다른 스크립트에서 호출 할 수있는 가능성을 가질 수 있습니까? 얼마나 정확하게? 이 "논리를 명령 행 인수 처리와 분리하는 것"은 전에 나에게 들려 준 것이지만, 내 스크립트에서 구현하는 방법을 모르겠다. (나는 노력했지만 성공하지 못했다.) ....

그래서 내가 어떻게 작성했는지 보도록 원본 코드를 올리며, 비평가를 만들거나 코드를 수정하여 스크립트가 올바르게 작동하도록 만드는 방법을 알려주십시오.

#!/usr/bin/env python

import re,sys

if len(sys.argv) != 2:
    print 'usage : getMayaCameras.py <path_to_originFile> \nYou must specify the path to the origin file as the first arg'
    sys.exit(1)


def getMayaCameras(filename = sys.argv[1]): 
    try:
        openedFile = open(filename, 'r')
    except Exception:
        print "This file doesn't exist or can't be read from"
        import sys
        sys.exit(1)

    cameras = []    
    for line in openedFile: 
        cameraPattern = re.compile("createNode camera")     
        cameraTest = cameraPattern.search(line) 
        if cameraTest:      
            cameraNamePattern = re.compile("-p[\s]+\"(.+)\"")           
            cameraNameTest = cameraNamePattern.search(line)         
            name = cameraNameTest.group(1)          
            cameras.append(name)            
    openedFile.close()

    return cameras      

getMayaCameras()

다시 한번 감사드립니다.

데이비드

해결법

  1. ==============================

    1.가장 좋은 대답은 아닙니다. getCameras.py를 다음과 같이 작성하십시오.

    가장 좋은 대답은 아닙니다. getCameras.py를 다음과 같이 작성하십시오.

    import stuff1
    import stuff2 
    import sys
    
    def main(arg1, arg2):
        # do whatever and return 0 for success and an 
        # integer x, 1 <= x <= 256 for failure
    
    if __name__=='__main__':
        sys.exit(main(sys.argv[1], sys.argv[2]))
    

    다른 스크립트에서 다음 작업을 수행 할 수 있습니다.

    import getCamera
    
    getCamera.main(arg1, arg2)
    

    또는 getCamera.py의 다른 함수를 호출하십시오.

  2. ==============================

    2.첫째로, 나는 명령 행 인자 처리에서 로직을 분리하기 위해 코드를 편집해야한다고 다른 사람들과 동의한다.

    첫째로, 나는 명령 행 인자 처리에서 로직을 분리하기 위해 코드를 편집해야한다고 다른 사람들과 동의한다.

    그러나 다른 라이브러리를 사용하고 편집을 혼란스럽게하고 싶지 않은 경우 파이썬에서 동일한 명령 행을 사용하는 방법을 아는 것이 여전히 유용합니다. 해결책은 os.system (명령)입니다. Windows에서 Atleast는 콘솔을 불러오고 명령 프롬프트에 입력 한 것과 같은 방식으로 명령을 실행합니다.

    import os
    os.system('getCameras.py "path_to_the_scene" ')
    
  3. ==============================

    3.os.system ()을 사용하는 것이 더 좋은 또 다른 방법은 os.system ()을 대체하기 위해 개발 된 서브 프로세스 모듈을 약간 더 오래된 다른 모듈과 함께 사용하는 것입니다. 다음과 같은 프로그램은 당신이 마스터 프로그램으로 전화하기를 원하는 프로그램입니다 :

    os.system ()을 사용하는 것이 더 좋은 또 다른 방법은 os.system ()을 대체하기 위해 개발 된 서브 프로세스 모듈을 약간 더 오래된 다른 모듈과 함께 사용하는 것입니다. 다음과 같은 프로그램은 당신이 마스터 프로그램으로 전화하기를 원하는 프로그램입니다 :

    import argparse
    
    # Initialize argument parse object
    parser = argparse.ArgumentParser()
    
    # This would be an argument you could pass in from command line
    parser.add_argument('-o', action='store', dest='o', type=str, required=True,
                        default='hello world')
    
    # Parse the arguments
    inargs = parser.parse_args()
    arg_str = inargs.o 
    
    # print the command line string you passed (default is "hello world")
    print(arg_str)
    

    위의 프로그램을 마스터 프로그램의 서브 프로세스와 함께 사용하면 다음과 같이 보입니다.

    import subprocess
    
    # run your program and collect the string output
    cmd = "python your_program.py -o THIS STRING WILL PRINT"
    out_str = subprocess.check_output(cmd, shell=True)
    
    # See if it works.
    print(out_str)
    

    하루가 끝나면이 책은 "이 문자열이 인쇄 될 것입니다"라고 인쇄됩니다. 이것은 제가 마스터 프로그램에 전달한 것입니다. 하위 프로세스에는 많은 옵션이 있지만 사용하는 경우 프로그램을 시스템 독립적으로 작성하므로 사용 가치가 있습니다. subprocess 및 argparse에 대한 설명서를 참조하십시오.

  4. ==============================

    4.execfile ()은 다른 스크립트 내에서 하나의 스크립트를 실행하는데, 이는 당신이 원하는 것이 아닙니다. 하위 프로세스 모듈을 사용하여 파이썬 인터프리터의 다른 인스턴스를 실행할 수 있지만, getCameras.py를 살펴보고 가져온 후에 호출 할 수있는 함수가 있는지 확인해야합니다.

    execfile ()은 다른 스크립트 내에서 하나의 스크립트를 실행하는데, 이는 당신이 원하는 것이 아닙니다. 하위 프로세스 모듈을 사용하여 파이썬 인터프리터의 다른 인스턴스를 실행할 수 있지만, getCameras.py를 살펴보고 가져온 후에 호출 할 수있는 함수가 있는지 확인해야합니다.

  5. ==============================

    5.getCameras.py를 재구성하고 get_cameras ()라는 메서드에서 카메라 목록 코드를 가져온다. 그런 다음 다른 파이썬 스크립트에서이 메서드를 호출 할 수 있습니다.

    getCameras.py를 재구성하고 get_cameras ()라는 메서드에서 카메라 목록 코드를 가져온다. 그런 다음 다른 파이썬 스크립트에서이 메서드를 호출 할 수 있습니다.

    getCameras.py

    def get_cameras():
    bulabula...
    if __name__ == '__main__':
    return get_cameras()
    

    사용 방법 : other.py

    import getCameras
    camera_list = getCameras.get_cameras()
    
  6. from https://stackoverflow.com/questions/4230725/how-to-execute-a-python-script-file-with-an-argument-from-inside-another-python by cc-by-sa and MIT license