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


86

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

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

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


myModule을 가져온 경우 myModule.main(). 지금까지 뭐 해봤 어?
— Marius

일반적으로 쉘 스크립트에서 전달하는 입력 인수가 걱정됩니다.
— Ricky Robinson

subprocess모듈 로 호출하는 것이 합리적 입니까?
— BenDundee

네, 더 쉬울 것 같아요.
— Ricky Robinson

답변:


114

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

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__가 설정되고 이에 대한 테스트를 통해 코드가 어떻게 실행되었는지 알 수 있습니다.


3
확실한. 그러나 입력 인수는 어떻습니까? 를 사용 argparse하므로 터미널에서 스크립트를 호출 할 때 $ python myModule -a input_a -b input_b --parameterC input_c. 파이썬 코드 내에서 어떻게 작동합니까? 단순한 검색으로는 찾을 수 없었던 것입니다.
— Ricky Robinson

@RickyRobinson : 두 가지 방법 모두 사용할 수 있음을 보여주기 위해 확장되었습니다. 파싱되거나 파싱 될 인수를 전달하기 만하면됩니다.
— Martijn Pieters

1
감사. 어떤 모듈이나 스크립트에 속하는 코드의 일부를 지정해 주시겠습니까? 처음에 생각했던 것보다 훨씬 번거롭게 보입니다.
— Ricky Robinson

@RickyRobinson : 두 발췌문이 같은 모듈에 함께 속합니다. 나는 그것을 명시 적으로 만들었습니다.
— Martijn Pieters

42

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

4
유용한 부록에 대해 정말 감사합니다 - 이것은 내가 필요 정확히
— HFBrowning

이것은 Python 2에서 작동했을 수도 있지만 Python 3에서는 더 이상 작동하지 않으며 모듈의 main () 함수를 호출 할 수 없습니다.AttributeError: module 'sqlacodegen' has no attribute 'main'
— NaturalBornCamper

24

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

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

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

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

import myModule

myModule.main()

이것은 모듈이 __all__.

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


오, 해명 해주셔서 감사합니다. 나는 모든 것을 main () 함수에 넣었으므로 괜찮을 것입니다. 이 "두 번째"메인에 입력 인수를 전달하는 방법에 대해 더 걱정합니다. 그렇게하는 쉬운 방법이 있습니까?
— Ricky Robinson

물론 :import sys; module.main(sys.argv);
— Aaron Digulla

이 액세스하는 방법에 대한 좋은 대체 설명이다 __main__나에게 도움이, 감사 @AaronDigulla
— 찰리 G

여기에 또 다른 함수에서 주를 호출하는 트릭은 다음과 같습니다 stackoverflow.com/a/20158605/3244382
— PatriceG

3

나도 같은 필요가 있었다 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이 말한대로하면됩니다.


3

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

경우 main.py및 parse_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)

0

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

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:])

감사. 나는 실제로 argparse대신 sys.argv. 이 경우 어떻게 변할까요? 또한 외부 스크립트에서 사용자가 입력하는 몇 가지 입력 인수를 전달하고 싶습니다. 반면 내부 스크립트 (myModule.py)에 대한 다른 입력 인수는 저에 의해 하드 코딩됩니다.
— Ricky Robinson

코드 자체를 보지 않고는 세부 사항에 답하기가 어렵습니다. 일반적으로 모든 인수를 전달합니다. *압축이 배열 f(a) => f([1,2,3])대 f(*a) => f(1,2,3) 당신은 쉽게 할 수있는 myModule.main(sys.argv[1], "other value", 39)또는 무엇 이건.
— agoebel 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.