从Python的命令行中选择要执行的程序部分[关闭]

问题描述 投票:-5回答:4

my_program.py说,我有一个很大的计划。我想用两个选项执行,例如1或2.如果选择选项1(python my_program.py 1),我希望my_program.py执行代码的某些部分(特别是第70到117行和注释行118到130),如果2是选择我想要相反的行为(注释/停用第70到117行并取消注释/激活第118到130行)。

我知道argparse要从命令行读取,但你有一个(相对)干净的解决方案吗?

python
4个回答
1
投票

您应该将代码组织成函数,例如。

def Function1():
    # Some code


def Function2():
    # And more code

这样您就可以选择要调用的代码:

Function1() # invoke code included in "Function1"
Function2() # or in Function2

要根据参数调用函数,可以使用条件表达式:

arg = sys.argv[1] # get entered argument

if arg == "1":
    Function1()
elif arg == "2":
    Function2()

或者(更好的解决方案)使用字典:

jobs = {"1" : Function1, "2" : Function2} # Relate arguments with functions
arg = sys.argv[1]
jobs[arg]() # invoke function

所以整个文件看起来像这样:

import sys

def function1():
    # Some code

def function2():
    # More code

def main():
    jobs = {"1": function1, "2": function2}
    choosenOption = sys.argv[1]
    jobs[choosenOption]()

if __name__ == "__main__":
    main()

另外,我建议你阅读有关函数的内容,其中使用的是编程的基础 - https://docs.python.org/3/tutorial/controlflow.html#defining-functions


2
投票

看看优秀的图书馆Click。它允许您将程序包装到从命令行调用时充当程序命令的函数中。

您的主文件看起来像这样:

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Run lines 70 to 117."""
    for x in range(count):
        click.echo('Hello %s!' % name)

@click.command()
@click.option('--count', default=1, help='Number of farewells.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def bye(count, name):
    """Run lines 118 to 130."""
    for x in range(count):
        click.echo('Bye %s!' % name)

if __name__ == '__main__':
    hello()

你可以在命令行执行它,如:

$ python3 my_program.py hello

1
投票

你可以在python中使用sys模块

import sys

if sys.argv[1] == 1:
  ---
elif sys.argv[1] == 2:
  ---

1
投票

Python Fire是一种在Python中创建CLI并由Google https://github.com/google/python-fire支持的简单方法

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)


output:
    python calculator.py double 10  # 20
    python calculator.py double --number=15  # 30
© www.soinside.com 2019 - 2024. All rights reserved.