【问题标题】:How to pass parameters on command line without using flags in python如何在命令行上传递参数而不在python中使用标志
【发布时间】:2023-04-03 13:03:02
【问题描述】:

所以我有我的 main.py 脚本,它基本上将根据命令行上传递的内容运行某些条件语句。例如,如果我使用main.py -t,这将运行测试模式。如果我运行main.py -j /testdata -c 2222-22-22 -p 2222-22-22,这将运行默认模式等等。

我怎样才能停止在命令行上传递标志并能够运行我的代码,而不是使用标志 -j , -c 和 -p ,我可以正常传递值。

到目前为止,我的代码如下:

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-c", "--execute-cur-date", action="store", required=False)
    parser.add_argument("-p", "--execute-pre-date", action="store", required=False)
    parser.add_argument("-j", "--execute-json-path", action="store", required=False)
    parser.add_argument("-t", "--execute-test", action="store_true", required=False)
    args = parser.parse_args()

    if args.execute_test:

        testing()

    elif args.execute_json_path and args.execute_cur_date and args.execute_pre_date:

【问题讨论】:

  • argparse 接受 positional 参数,这些参数完全取决于位置(顺序)而不是标志。但是对于那些你必须按照解析器定义的顺序提供所有值。或者您可以自己解析sys.argv 列表。
  • @hpaulj 它如何知道 sys.argv 意味着哪些条件语句?
  • sys.argv 中,您只得到一个字符串列表,而您自己的代码必须决定其中的含义。如果这让您感到困惑,请坚持使用已标记的版本,
  • 您得到的答案毫无帮助,因为您的问题没有任何意义。您是什么意思“正常传递值”?用户@arudzinska 似乎提供了最有说服力的答案。如果出现这些标志时您没有执行任何操作,为什么还要解析命令行中的参数而不是 -t

标签: python python-2.7 command-line arguments argparse


【解决方案1】:

使用sys 模块解析命令行参数(sys.argv 将是参数列表):

#!/usr/bin/env python3

import sys

# The first argument (sys.argv[0]) is the script name
print('Command line arguments:', str(sys.argv))

运行脚本:

$ python3 script.py these are my arguments
Command line arguments: ['script.py', 'these', 'are', 'my', 'arguments']

您可以在this tutorial 中找到更多使用示例。

【讨论】:

  • 所以如果我使用 sys.argv ,它如何区分条件语句?
  • 它们存储在一个列表中,您可以单独查看它们
  • 如果您不想使用标志,那么您的参数将需要有一个特定的顺序 - 您将根据它们的位置从参数列表中检索它们。您需要在条件语句中编写处理每个参数的逻辑。
  • @arudzinska 你能否指出或提供一个例子。我有点困惑?
  • 例如,您可以检查参数列表的长度,如果它等于 1(仅脚本名称),则表示没有传递任何参数,您可以在标准模式下运行。如果参数列表的长度大于 1,则意味着传递了一些参数 (sys.argv[1:]),因此您可能应该验证它们,然后在脚本中运行一些其他指令。查看this question
【解决方案2】:

你可能想看看 python-fire https://github.com/google/python-fire

import fire


def main(c=None, p=None, j=None, t=None):
    print(c, p, j, t)
    if c:
        print("C passed")
    elif p and j and t:
        print("P, J, T passed")


if __name__ == "__main__":
    fire.Fire(main)

你可以通过 None 来跳过参数。

python main.py None p_val j_val t_val

python main.py c_val

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 2016-02-22
    • 2019-07-16
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多