是否可以将 '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。
总而言之,原则是将真正的工作与选项解析分开。
我不知道您的应用程序的所有详细信息,因此它可能不是您要找的答案,但在许多编程语言中这是很常见的事情。
有两个 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。
总而言之,原则是将真正的工作与选项解析分开。
我不知道您的应用程序的所有详细信息,因此它可能不是您要找的答案,但在许多编程语言中这是很常见的事情。