我有一个很棒的计划,比如my_program.py
。我想用两个选项执行,例如1或2.如果选择了选项1(python my_program.py 1
),我希望my_program.py
执行代码的某些部分(特别是第70到117行和注释行) 118到130),如果选择2,我想要相反的行为(注释/停用第70到117行并取消注释/激活第118到130行)。
我知道argparse
要从命令行读取,但是你有一个(相对)干净的解决方案吗?
答案 0 :(得分: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 :(得分:1)
您可以在python中使用 sys 模块
import sys
if sys.argv[1] == 1:
---
elif sys.argv[1] == 2:
---
答案 2 :(得分:1)
您应该将代码组织成函数,例如。
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbarMain"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</android.support.design.widget.AppBarLayout>
这样您就可以选择要调用的代码:
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
另外,我建议你阅读有关函数的内容,这些函数是编程的基础 - https://docs.python.org/3/tutorial/controlflow.html#defining-functions
答案 3 :(得分: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