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.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)

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.