【问题标题】:How to use a module with arguments?如何使用带参数的模块?
【发布时间】:2018-11-16 13:54:56
【问题描述】:

我有一个名为 T 的模块,它有几个函数和调用这些函数的主要部分。从另一个模块,我想使用这个模块。主要方案是这样的:

"""Module T"""
def parse_args():
    parser = argparse.ArgumentParser(description='Desc')
    parser.add_argument('something')

def foo():
    pass

if __name__ == "__main__":
    args = parse_args()
    foo()

以及我想使用的另一个模块:

"""Module M"""
def foo():
    pass

def do_something():
    """Where I want to use module T's main"""

我已经使用带有参数的终端模块 T 并且工作正常。这个问题可能很简单,但是如何将它的 main 与参数一起使用?

【问题讨论】:

  • 如果你真的需要调用它的main,我认为唯一的方法就是把它作为一个外部程序来调用。但是你为什么要首先调用它的 main 呢?为什么不直接在里面直接调用Ts 方法呢?
  • 似乎最简单的解决方案可能只是将这两行拉入T内的main()函数,然后从TM调用main()。跨度>
  • @TobiasBrösamle 我是 python 新手,它是关于 main 的逻辑。我已经搜索了这个问题的答案,但没有找到任何答案。我认为一个与 0x5453 相同的解决方案,但坚持要找到一种更简单的方法。你们俩可能都是对的。

标签: python


【解决方案1】:

run 函数(或main 或任何你喜欢的)添加到接受命令行的模块中,并确保parse_args 也可选择接受任意列表:

def parse_args(args=None):
    parser = argparse.ArgumentParser(description='Desc')
    parser.add_argument('something')
    return parser.parse_args(args)

def foo():
    pass

def run(args=None):
    args = parse_args(args)
    foo()

if __name__ == "__main__":
    run()

基本上,与其尝试模拟导入操作并注入sys.argv(这实际上可能),您只需将您感兴趣的导入运行的部分分解出来,并提供对它的访问:

import T

T.run()  # Uses sys.argv
T.run(['my', 'list', '--of', 'args'])

虽然完全未经测试,但您也可以执行以下操作(但请不要这样做,这只是为了好玩):

import sys
from importlib import reload

sys.argv[1:] = my_args

if 'T' in sys.modules:
    reload(sys.modules['T'])
else:
    import T

但是您需要删除T.py 中的导入保护。除非你想实现你自己的模块加载序列,这样你就可以注入T.__name__,而不必修改导入保护:Injecting variables into an import namespace

【讨论】:

  • 我想你会想从受保护的区块中调用run,而不是foo
  • @chepner。是的。固定的。在移动设备上快速打字:)
  • 所以我只需要在M中导入T,然后做T.run()?如果是这样,为什么我需要主要部分?
  • 我还认为您想在您的 run 方法中将 args 提供给 parse_args
  • 我认为这就是解决方案。我会告诉你。非常感谢。比我想象的要容易:)
【解决方案2】:

如果直接调用脚本,则会执行if __name__ ... 模式,因此真正的解决方案是在入口点调用fooif __name__ ... 模式基本上可以保护代码行在导入时不被执行。例如,这是一种非常方便的测试模式——只需将测试放在受保护的块中即可。做你所要求的直接方法:

"""Module M"""
def bar():
    pass

def do_something(args):
    args = parse_args()
    module_t.foo()

如果您希望模块 M 完全“一劳永逸”,那么 Mad Physicist 的答案就是给您。

【讨论】:

  • 什么是module_m
  • 好消息应该是 module_t @MadPhysicist!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多