[python] Python에서 가져온 모듈의 main ()을 호출 할 수 있습니까?

파이썬 에는 몇 가지 함수를 정의하는 myModule.py 모듈 과 몇 가지 명령 줄 인수를 사용 하는 main ()이 있습니다.

나는 보통 bash 스크립트에서 이것을 main ()이라고 부른다. 이제 모든 것을 작은 패키지 에 넣고 싶습니다 . 그래서 간단한 bash 스크립트를 Python 스크립트로 바꿔서 패키지에 넣을 수있을 것이라고 생각했습니다.

그래서, 내가 어떻게 실제로 않는 주 ()를 호출 myModule.py의 기능을 주 () 함수에서 MyFormerBashScript.py의? 저도 할 수 있습니까? 인수 를 어떻게 전달 합니까?



답변

그것은 단지 기능입니다. 그것을 가져 와서 호출하십시오.

import myModule

myModule.main()

인수를 구문 분석해야하는 경우 두 가지 옵션이 있습니다.

  • 에서 구문 분석하되 매개 변수로 main()전달합니다 sys.argv(아래의 모든 코드는 동일한 모듈에 있음 myModule).

    def main(args):
        # parse arguments using optparse or argparse or what have you
    
    if __name__ == '__main__':
        import sys
        main(sys.argv[1:])
    

    이제 myModule.main(['arg1', 'arg2', 'arg3'])다른 모듈에서 가져오고 호출 할 수 있습니다 .

  • main()이미합니다 (다시 모든 코드를 구문 분석하는 매개 변수 동의 myModule모듈) :

    def main(foo, bar, baz='spam'):
        # run with already parsed arguments
    
    if __name__ == '__main__':
        import sys
        # parse sys.argv[1:] using optparse or argparse or what have you
        main(foovalue, barvalue, **dictofoptions)
    

    myModule.main(foovalue, barvalue, baz='ham')다른 곳에서 가져오고 호출 하고 필요에 따라 파이썬 인수를 전달합니다.

여기서 트릭은 모듈이 스크립트로 사용되는시기를 감지하는 것입니다. 파이썬 파일을 메인 스크립트 ( python filename.py) 로 실행할 때 어떤 import문도 사용 되지 않으므로 파이썬은 해당 모듈을 호출합니다 "__main__". 그러나 동일한 filename.py코드가 모듈 ( import filename) 로 취급되면 파이썬은 대신이를 모듈 이름으로 사용합니다. 두 경우 모두 변수 __name__가 설정되고 이에 대한 테스트를 통해 코드가 어떻게 실행되었는지 알 수 있습니다.


답변

Martijen의 대답은 의미가 있지만 다른 사람들에게는 분명해 보일지 모르지만 알아 내기가 어려웠던 중요한 것이 누락되었습니다.

argparse를 사용하는 버전에서는 본문에이 줄이 있어야합니다.

args = parser.parse_args(args)

일반적으로 스크립트에서 argparse를 사용하는 경우

args = parser.parse_args()

parse_args는 명령 줄에서 인수를 찾습니다. 그러나이 경우 주 함수는 명령 줄 인수에 액세스 할 수 없으므로 인수가 무엇인지 argparse에 알려야합니다.

다음은 예입니다.

import argparse
import sys

def x(x_center, y_center):
    print "X center:", x_center
    print "Y center:", y_center

def main(args):
    parser = argparse.ArgumentParser(description="Do something.")
    parser.add_argument("-x", "--xcenter", type=float, default= 2, required=False)
    parser.add_argument("-y", "--ycenter", type=float, default= 4, required=False)
    args = parser.parse_args(args)
    x(args.xcenter, args.ycenter)

if __name__ == '__main__':
    main(sys.argv[1:])

이 mytest.py 이름을 지정했다고 가정하면 실행하려면 명령 줄에서 다음 중 하나를 수행 할 수 있습니다.

python ./mytest.py -x 8
python ./mytest.py -x 8 -y 2
python ./mytest.py

각각 반환

X center: 8.0
Y center: 4

또는

X center: 8.0
Y center: 2.0

또는

X center: 2
Y center: 4

또는 다른 파이썬 스크립트에서 실행하려면 다음을 수행하십시오.

import mytest
mytest.main(["-x","7","-y","6"])

반환하는

X center: 7.0
Y center: 6.0


답변

때에 따라 다르지. 기본 코드가 ifas로 보호되는 경우 :

if __name__ == '__main__':
    ...main code...

그러면 자동 변수에 영향을 줄 수 없기 때문에 Python이이를 실행하도록 할 수 없습니다 __name__.

그러나 모든 코드가 함수에 있으면 가능할 수 있습니다. 시험

import myModule

myModule.main()

이것은 모듈이 __all__.

from myModule import *main표시 되지 않을 수 있으므로 모듈 자체를 실제로 가져와야합니다.


답변

나도 같은 필요가 있었다 argparse. 문제는 객체 인스턴스의 parse_args기능이 argparse.ArgumentParser기본적으로 sys.args. Martijn 줄을 따르는 해결 방법은이를 명시 적으로 만드는 것으로 구성되므로 parse_args원하는대로 전달하는 인수를 변경할 수 있습니다 .

def main(args):
    # some stuff
    parser = argparse.ArgumentParser()
    # some other stuff
    parsed_args = parser.parse_args(args)
    # more stuff with the args

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

요점은 parse_args함수에 인수를 전달하는 것입니다. 나중에 메인을 사용하려면 Martijn이 말한대로하면됩니다.


답변

내가 찾고 있던 대답은 여기에 대답했습니다. sys.argv 이외의 args와 함께 python argparse를 사용하는 방법?

경우 main.pyparse_args()이 방법에 기록 된 다음 구문 분석 잘 수행 할 수 있습니다

# main.py
import argparse
def parse_args():
    parser = argparse.ArgumentParser(description="")
    parser.add_argument('--input', default='my_input.txt')
    return parser

def main(args):
    print(args.input)

if __name__ == "__main__":
    parser = parse_args()
    args = parser.parse_args()
    main(args)

그런 다음 다른 Python 스크립트에서 main()인수를 호출 하고 구문 분석 할 수 있습니다 parser.parse_args(['--input', 'foobar.txt']).

# temp.py
from main import main, parse_args
parser = parse_args()
args = parser.parse_args([]) # note the square bracket
# to overwrite default, use parser.parse_args(['--input', 'foobar.txt'])
print(args) # Namespace(input='my_input.txt')
main(args)


답변

명령 줄 인수도 전달하려고한다고 가정합니다.

import sys
import myModule


def main():
    # this will just pass all of the system arguments as is
    myModule.main(*sys.argv)

    # all the argv but the script name
    myModule.main(*sys.argv[1:])


답변