如果__name__ == '__main__'函数调用

9

我正在尝试解决一段代码中出现的问题,这段代码是我需要构建的。我有一个Python模块,需要能够导入并传递参数,这些参数将由主模块进行解析。我收到的代码看起来像这样:

#main.py
if __name__ == '__main__' 
    sys.argv[] #pass arguments if given and whatnot
    Do stuff...

我需要添加一个main()函数,它可以接收参数并解析它们,然后像下面这样将它们传递:
#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...

总之,我需要导入main.py并传递由main()函数解析的参数,然后将返回的信息提供给if __name__ == '__main__'部分。 编辑 为了澄清我的做法。
#hello_main.py 
import main.py

print(main.main("Hello, main"))

同时,我仍希望能够通过shell调用main.py

$: python main.py "Hello, main"

因此,保留name == main是我的要求。

这是否可能?我今天花了很多时间研究这个问题,因为我想尽可能地保留给定的main.py模块。

谢谢,

dmg


1
你尝试过什么?你遇到了哪些错误?请告诉我你没有浪费宝贵的时间"研究"这个问题,而没有运行代码。 - Jared Smith
当模块被“调用”而不是导入时,才会执行if __name__ == '__main__':部分。 - Jean-François Fabre
2
使用sys.argv传递参数,在“if name =='main'”中调用您的“main”函数有什么问题? - M.T
@Jean-FrançoisFabre:你如何“调用”一个模块? - martineau
@M.T 我编辑了我的问题以澄清。我在 if name == 'main': 中调用 main(sys.argv),但是当我尝试通过仅传递参数从shell运行main.py时遇到ArgumentParser错误对象没有args的错误。 - DmgCtrl-b.net
显示剩余2条评论
1个回答

16

在模块文件中,您可以编写if __name__ == "__main__"以获取在直接调用该文件时指定的特定行为,例如通过 shell:

#mymodule.py
import sys
def func(args):
    return 2*args

#This only happens when mymodule.py is called directly:
if __name__ == "__main__":
    double_args = func(sys.argv[1])
    print("In mymodule:",double_args)

当导入到另一个文件时,仍然可以使用该函数:

#test.py
import mymodule
print("In test:",mymodule.func("test "))

因此,调用python test.py将导致"In test: test test ",而调用python mymodule.py hello将导致"In mymodule: hellohello"

这正是我在寻找的。谢谢你。 - DmgCtrl-b.net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接