Python:如何使用__name__ =='__ main__'从其他路径调用模块

时间:2018-03-29 22:31:45

标签: python

如本回答how to import module所述,可以通过这种方式导入位于另一条路径中的模块:

import sys
sys.path.append('PathToModule')
import models.user

我的问题是:

如果通过这种方式设置其他模块,如何执行其他模块(并将参数传递给它):

if __name__ == '__main__':
    do_something()

do_something()使用argparse.ArgumentParser来处理提供的参数?

我在第一个问题/评论之后添加以下内容

我可以通过

传递参数
sys.argv[1:] = [
    "--param1", "123",
    "--param2", "456",
    "--param3", "111"
]

所以这个主题已经涵盖了。

为什么我要调用另一个带参数的模块?

我希望能够为另一个项目做一个小的回归测试。我希望通过git clone获得这个其他项目,并在本地提供不同版本,如果需要,我也可以调试。

但我不想过多参与其他项目(因此分叉没有意义)。

所以我的剩余问题

如何在调用其他模块时调整__name__的内容?

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决这个问题。

  1. 如果要导入的模块写得很好,它应该有单独的函数来解析命令行参数和实际工作。看起来应该是这样的:

    def main(arg1, arg2):
        pass  # do something
    
    def parse_args():
        parser = argparse.ArgumentParser()
        ... # lots of code
        return vars(parser.parse_args())
    
    if __name__ == '__main__':
        args = parse_args()
        main(**args)
    

    在这种情况下,您只需导入模块,然后使用正确的参数调用其main函数:

    import yourModule
    yourModule.main('foo', 'bar')
    

    这是最佳解决方案。

  2. 如果模块没有定义这样的main功能,您可以手动设置sys.argv并使用runpy.run_module执行模块:

    import runpy
    import sys
    
    sys.argv[1:] = ['foo', 'bar']
    runpy.run_module('yourModule', run_name='__main__', alter_sys=True)
    

    请注意,这只执行模块;它没有导入它。 (即,该模块不会添加到sys.modules,并且您没有获得可与之交互的模块对象。)