파이썬 에는 몇 가지 함수를 정의하는 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
답변
때에 따라 다르지. 기본 코드가 if
as로 보호되는 경우 :
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.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)
답변
명령 줄 인수도 전달하려고한다고 가정합니다.
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:])