是否可以将 'OptionParser' 对象作为输入参数发送到导入的 python 模块的 运行 main?

Is it possible to send an 'OptionParser' object as input arguement to run main of imported python module?

有两个 python 脚本,'script1.py' 和 'script2.py'。

'script1.py' 使用 OptionParser 解析命令行参数。

'script1.py' 的内容看起来像这样

from optparse import OptionParser

def main():
    parser = OptionParser()
    parser.add_option("-o", "--option1")
    parser.add_option("-p", "--option2")
    (opts, args) = parser.parse_args()

    # Do things with the options

if __name__ == '__main__':
    main()

到运行它在命令行上。它是 运行 和:

python script1.py -o Option1 -p Option2

'script2.py' 也使用以相同方式实现的 OptionParser,但具有不同的选项集。

'script2.py' 也将 'script1.py' 作为模块导入。

我想 运行 来自 script2.py 的 script1.py 的主体。最好的方法是什么?

我让它工作的一种方法是改变 script1.py 的主要部分以将 OptionParser 作为参数。

def main(OptionParser):
...
...
...
if __name__ == '__main__':
    main(OptionParser)

并确保两个脚本的 OptionParser 具有完全相同的选项。如果我这样做,那么我可以将 OptionParser 对象从 script2 传递到 script1,如下所示:

script1.main(OptionParser)

有没有办法在不使两个脚本中的 OptionParser 相同的情况下获得相同的结果。

理想情况下,我希望它按如下方式工作:

script1.main(option1="Option1", option2="Option2")

这样我可以 运行 script1 从命令行和另一个脚本。

编辑: 我也知道我可以使用 subprocess 和 os.system() 来执行 python 脚本。我想知道是否有更简洁的方法来设计两个脚本之间的交互。

编辑 2: 根据 Mig 的建议,我将选项解析器移出 main.

scrip1.py现在看起来如下

def main(option1, option2):
    # Do main things

if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option("-o", "--option1")
    parser.add_option("-p", "--option2")
    (opts, args) = parser.parse_args()

    main(option1=opts.option1, option2=opts.option2)

现在从 script2.py 导入 script1.py 作为模块后我可以调用 script1 的 main script1.main(option1="Option1", option2="Option2").

如果您有既可以用作主脚本又可以用作导入脚本的函数,那么我不会在其中使用 opt 解析器。有很多方法可以做到这一点,但你可以有一个 main 只处理你的 opt 解析器,然后将正确的参数传递给真正负责这项工作的函数。你明白我的意思吗?

然后在这种情况下,从命令行调用它将从 opt 解析器获取参数,但如果您将它用作库,那么您将调用函数来完成这项工作。

另一种非常相似的方法是将 main 保留为执行实际工作的函数,但最后在 if __name__ == '__main__': 块中创建 opt 解析器。您在 this 块中构建您的 opt 解析器并使用它需要的参数调用 main。

总而言之,原则是将真正的工作与选项解析分开。

我不知道您的应用程序的所有详细信息,因此它可能不是您要找的答案,但在许多编程语言中这是很常见的事情。