如本回答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__
的内容?
答案 0 :(得分: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')
这是最佳解决方案。
如果模块没有定义这样的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
,并且您没有获得可与之交互的模块对象。)