1

有两个 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 的 main 以将 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 作为模块后,我可以调用 main of script1 script1.main(option1="Option1", option2="Option2")

4

1 回答 1

0

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

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

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

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

我不知道你的应用程序的所有细节,所以它可能不是你正在寻找的答案,但在许多编程语言中这是很常见的事情。

于 2019-08-12T05:51:04.250 回答