GVKun编程网logo

如何在Python中处理命令行参数?(python3 命令行参数)

9

在本文中,我们将给您介绍关于如何在Python中处理命令行参数?的详细内容,并且为您解答python3命令行参数的相关问题,此外,我们还将为您提供关于python命令行参数处理、python如何优雅的

在本文中,我们将给您介绍关于如何在Python中处理命令行参数?的详细内容,并且为您解答python3 命令行参数的相关问题,此外,我们还将为您提供关于python 命令行参数处理、python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一、python-如何使用命令行在pytest中传递多个参数?、Python-如何读取/处理命令行参数?的知识。

本文目录一览:

如何在Python中处理命令行参数?(python3 命令行参数)

如何在Python中处理命令行参数?(python3 命令行参数)

如果我期望像001或999这样的东西(这次让我们将期望值限制为001 …
999范围),并且传递了其他一些参数,并且想忽略任何意外内容,那么这将是处理命令行参数的简单表达式?

我知道,例如,如果我需要确定是否在参数之间传递了“ debug”,它将像这样:

if ''debug'' in argv[1:]:  print ''Will be running in debug mode.''

如何确定是否通过了009或575?

所有这些都是预期的电话:

python script.pypython script.py 011python script.py 256 debugpython script.py 391 xlspython script.py 999 debug pdf

在这一点上,我不在乎这样的电话:

python script.py 001 002 245 568python script.py some unexpected argumentpython script.py 0001python script.py 02

…第一个-由于存在多个“数字”参数;第二-因为…好吧,意想不到的争论;第三和第四-由于非3位数参数。

答案1

小编典典

正如其他人回答的那样,optparse是最好的选择,但是如果您只想快速编写代码,请尝试以下操作:

import sys, refirst_re = re.compile(r''^\d{3}$'')if len(sys.argv) > 1:    if first_re.match(sys.argv[1]):        print "Primary argument is : ", sys.argv[1]    else:        raise ValueError("First argument should be ...")    args = sys.argv[2:]else:    args = ()# ... anywhere in code ...if ''debug'' in args:    print ''debug flag''if ''xls'' in args:    print ''xls flag''

编辑 :这是一个optparse的示例,因为这么多的人在回答optparse时并没有真正解释原因,也没有解释要使其正常工作必须进行的更改。

使用optparse的主要原因是,它为您提供了更高的灵活性以供以后扩展,并为您提供了更多的命令行灵活性。换句话说,您的选项可以按任何顺序出现,并且使用信息会自动生成。但是,要使其与optparse一起使用,您需要更改规范,以在可选参数前面加上“-”或“-”,并且需要允许所有参数以任何顺序排列。

因此,这是使用optparse的示例:

import sys, re, optparsefirst_re = re.compile(r''^\d{3}$'')parser = optparse.OptionParser()parser.set_defaults(debug=False,xls=False)parser.add_option(''--debug'', action=''store_true'', dest=''debug'')parser.add_option(''--xls'', action=''store_true'', dest=''xls'')(options, args) = parser.parse_args()if len(args) == 1:    if first_re.match(args[0]):        print "Primary argument is : ", args[0]    else:        raise ValueError("First argument should be ...")elif len(args) > 1:    raise ValueError("Too many command line arguments")if options.debug:    print ''debug flag''if options.xls:    print ''xls flag''

optparse与您的规范之间的区别在于,现在您可以拥有以下命令行:

python script.py --debug --xls 001

您可以通过调用parser.add_option()轻松添加新选项

python 命令行参数处理

python 命令行参数处理

getopt函数的格式是getopt.getopt ( [命令行参数列表], "短选项", [长选项列表] )
短选项名后的冒号(:)表示该选项必须有附加的参数。
长选项名后的等号(=)表示该选项必须有附加的参数。
返回opts和args。
opts是一个参数选项及其value的元组( (''a'', ''b''))

args是一个除去有用参数外其他的命令行输入 ( ''c'', ''d'' )

import sys
import getopt

def main(argv):

	try:
		opts, args = getopt.getopt(argv, "hs:abc" , ["help", "score=", "format"])
		print(opts)
		print(args)
	except Exception, err:
		print(str(err))

if __name__ == "__main__":
	main(sys.argv[1:])
测试1:python test_argv.py --help --score=90 --format -a -s -b  -c  -hh
[(''--help'', ''''), (''--score'', ''90''), (''--format'', ''''), (''-a'', ''''), (''-s'', ''-b''), (''-c'', ''''), (''-h'', ''''), (''-h'', '''')]
[]

测试2:python test_argv.py --help --score=90 --format -a -s -b  -c  -kk
option -k not recognized

待续一下 

python optparser模块使用  

python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一

python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一

背景

我们在编写python程序时,程序中经常会提供多种功能或者模式,在实际使用时根据不同的参数使用不同的功能。那么如何获取命令行传入进来的参数呢?

一般方法

一般情况下,我们会使用 sys 模块,如

import sys

# 打印 sys 模块获取到的命令行参数
print(sys.argv)

或者,我们会使用 getopt 模块,如

import getopt

opts,args=getopt.getopt(sys.argv[1:],"i:ho:",["help","input=","output="])
# 打印选项列表
print(opts)
# 打印参数值列表
print(args)

# 解析参数对应的值
for opts,arg in opts:
    print(opts)
    if opts=="optName":
        print("optName is value is:", arg)

再或者,我们使用 argparse 模块,如

import argparse

parser = argparse.ArgumentParser()

parser.add_argument(''-a'', ''--arg1'', help=''argument 1'')
parser.add_argument(''-b'', ''--arg2'', help=''argument 2'')
parser.add_argument(''-c'', ''--arg3'', help=''argument 3'')

args = parser.parse_args()

print(args.arg1)
print(args.arg2)
print(args.arg3)

但,以这些,都不优雅,如果我们需要在不同的函数或者模块中传递使用命令行进来的参数,那这些零散的参数处理代码,将会带来不小的麻烦。我们需要通过一个专门的类来封装命令行的参数。

引入 DebugInfo 模块

pip install DebugInfo

定义一个命令行参数类,

定义一个入参类,继承自 入参基类,来专门负责解析和管理我们的传入参数,示例见:

# -*- coding:UTF-8 -*-

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

class 入参类(入参基类):
    def __init__(self):
        # 初始化基类
        super().__init__(接口说明=''这个脚本是用来演示如何使用【入参基类】来管理传入参数的'')


if __name__ == ''__main__'':
    # 打印一下 入参基类 的说明文档
    print(入参基类.__doc__)

上面的代码初步建立了入参类,继承自入参基类,我们通过打印入参基类doc 信息,可以查阅到相关的使用说明,如
image.png
如,我们通过 doc 的说明信息得知,这个入参基类其实是在 argparse 的基础上做了二次封装,然后提供了一些易用的接口。

下面的代码为入参类添加了我们需要接收的参数,并实例化了入参类,并解析了命令行参数:

# -*- coding:UTF-8 -*-

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

class 入参类(入参基类):
    def __init__(self):
        # 初始化基类
        super().__init__(接口说明=''这个脚本是用来演示如何使用【入参基类】来管理传入参数的'')

        # 添加需要接收的参数
        self._添加参数(''a'', int, ''这是 a 参数, 请输入一个数字'', 0)
        self._添加参数(''b'', int, ''这是 b 参数, 请输入一个数字'', 0)
        self._添加参数(''运算'', [''和'', ''差''], ''请输入运算形式'', ''和'')


if __name__ == ''__main__'':
    # 实例化入参类
    入参 = 入参类()

    # 解析命令行参数
    入参.解析入参()

    # 打印获取到的参数
    print(入参.get(''a''))
    print(入参.get(''b''))
    print(入参.get(''运算''))

上面的代码运行效果如:
image.png

当我们在命令行中使用 -h 参数时,还会有相应的参数帮助提示,如
image.png

当我们输入的参数不正确时,还有相应的错误提示,如
image.png

这么多功能,相对于我们输入的代码量来说,是不是物超所值?优雅至极?

百尺杆头,更进一步

上面的代码中,我们通过 入参.get(''a'') 这样的方式获取了参数 a 的值.这不够优雅.
如的代码中,我们通过在 入参类 中定义property的方法,将每一个参数成员定义对应的getter接口,这样就可以通过 入参.a 这种方式获取和使用参数值了.同时也获得了 IDE 的成员提示和代码补全支持.

# -*- coding:UTF-8 -*-

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

class 入参类(入参基类):
    def __init__(self):
        # 初始化基类
        super().__init__(接口说明=''这个脚本是用来演示如何使用【入参基类】来管理传入参数的'')

        # 添加需要接收的参数
        self._添加参数(''a'', int, ''这是 a 参数, 请输入一个数字'', 0)
        self._添加参数(''b'', int, ''这是 b 参数, 请输入一个数字'', 0)
        self._添加参数(''运算'', [''和'', ''差''], ''请输入运算形式'', ''和'')

    # region 访问器
    @property
    def a(self) -> int:
        if ''a'' in self._参数字典:
            return self._参数字典[''a''].值
        else:
            return 0

    @a.setter
    def a(self, 值: int):
        if ''a'' in self._参数字典:
            if type(值) in [int, float]:
                self._参数字典[''a''].值 = int(值)

    @property
    def b(self) -> int:
        if ''b'' in self._参数字典:
            return self._参数字典[''b''].值
        else:
            return 0

    @b.setter
    def b(self, 值: int):
        if ''b'' in self._参数字典:
            if type(值) in [int, float]:
                self._参数字典[''b''].值 = int(值)

    @property
    def 运算(self) -> str:
        if ''运算'' in self._参数字典:
            return self._参数字典[''运算''].值
        else:
            return ''''

    @运算.setter
    def 运算(self, 值: str):
        if ''运算'' in self._参数字典:
            self._参数字典[''运算''].值 = str(值)
    # endregion


if __name__ == ''__main__'':
    # 实例化入参类
    入参 = 入参类()

    # 解析命令行参数
    入参.解析入参()

    # 打印获取到的参数
    print(入参.a)
    print(入参.b)
    print(入参.运算)

如此优雅的命令行参数解析和管理方式,我相信你从来没有见过,独此一份了.

效率支持

上面的代码中,我们看到我们为每一个参数写一个 property 的接口,好麻烦啊.优雅个毛线.
no!no!no! 你能想到的需求,作者当然要支持上了.

下面的代码中, 我们通过 入参.转换为属性范式() 将每一个命令行参数自动生成其对应的访问器接口,并且自动送到您的粘贴板里,您唯一需要做的就是 ctrl-V, 惊不惊喜? 意不意外?

# -*- coding:UTF-8 -*-

# region 引入必要依赖
from DebugInfo.DebugInfo import *

# endregion

class 入参类(入参基类):
    def __init__(self):
        # 初始化基类
        super().__init__(接口说明=''这个脚本是用来演示如何使用【入参基类】来管理传入参数的'')

        # 添加需要接收的参数
        self._添加参数(''a'', int, ''这是 a 参数, 请输入一个数字'', 0)
        self._添加参数(''b'', int, ''这是 b 参数, 请输入一个数字'', 0)
        self._添加参数(''运算'', [''和'', ''差''], ''请输入运算形式'', ''和'')


if __name__ == ''__main__'':
    # 实例化入参类
    入参 = 入参类()

    # 对每一个命令行参数,生成其对应的 访问器接口
    入参.转换为属性范式()

上面的代码中, 入参.转换为属性范式() 的效果如:

共生成了32行代码,每个参数的setter, getter属性都给你准备好了, ctrl+V 是您唯一需要做的事情了.
不让告诉我你不知道在哪里 ctrl+V

如果你不希望命令行参数被setter, 你可以通过函数参数控制生成,如

if __name__ == ''__main__'':
    # 实例化入参类
    入参 = 入参类()

    # 对每一个命令行参数,生成其对应的 访问器接口
    入参.转换为属性范式(setter=False)

小结

以上所分享的命令行参数解析+管理的方式,提供自 DebugInfo 模块内的 入参基类, 虽然是基于 argparse 的一个二次封装,但相对于直接使用 argparse, 确实方便和清晰不少.

python-如何使用命令行在pytest中传递多个参数?

python-如何使用命令行在pytest中传递多个参数?

我想将输入作为命令行选项传递给pytest文件. https://stackoverflow.com/a/42145604/8031479这个问题很有帮助,但我不知道添加多个解析器采用.

我尝试将其添加到我的conftest.py文件中,但没有帮助:

def pytest_addoption(parser):
    """
        This function is used to extract input1 and input2 values from the command line
    """
    parser.addoption(
        "--input1",action="store",default="input1"
    )
    parser.addoption(
        "--input2",default="input2"
    )

我的test.py文件的内容:

import pytest

@pytest.fixture()
def get_input1(input1):
    print 'input1:',input1
    return input1

# @pytest.mark.unit
@pytest.fixture()
def get_input2(input2):
    print 'input2:',input2
    return input2

def test_hello(get_input1,get_input2):
    print 'testing pytest fixtures with command line options'
    print get_input1,get_input2

这是我运行test.py文件的命令:

py.test test.py --input1="hello" --input2="world"

我收到此错误消息:

@pytest.fixture()
def get_input1(input1):
E       fixture 'input1' not found
>       available fixtures: cache,capfd,capfdbinary,caplog,capsys,capsysbinary,doctest_namespace,get_input1,get_input2,Metadata,monkeypatch,pytestconfig,record_property,record_xml_attribute,recwarn,tmp_path,tmp_path_factory,tmpdir,tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.
最佳答案
您可以通过以下方式使其工作:

conftest.py:

import pytest


def pytest_addoption(parser):
    parser.addoption("--input1",default="default input1")
    parser.addoption("--input2",default="default input2")



@pytest.fixture
def input1(request):
    return request.config.getoption("--input1")


@pytest.fixture
def input2(request):
    return request.config.getoption("--input2")

test.py:

import pytest

@pytest.mark.unit
def test_print_name(input1,input2):
    print ("displaying input1: %s" % input1)
    print("displaying input2: %s" % input2)

CLI:

>py.test -s test.py --input1 tt --input2 12
================================================= test session starts =================================================
platform win32 -- Python 3.7.0,pytest-4.1.1,py-1.7.0,pluggy-0.8.1
rootdir: pytest,inifile:
collected 1 item

test.py displaying input1: tt
displaying input2: 12
.

============================================== 1 passed in 0.04 seconds ===============================================

Python-如何读取/处理命令行参数?

Python-如何读取/处理命令行参数?

如何解决Python-如何读取/处理命令行参数??

标准库中的规范解决方案是argparse(docs)

这是一个例子:

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
                    help="write report to FILE", Metavar="FILE")
parser.add_argument("-q", "--quiet",
                    action="store_false", dest="verbose", default=True,
                    help="don''t print status messages to stdout")

args = parser.parse_args()
argparse 支持(除其他外):
  • 任意顺序的多个选项。
  • 短期和长期选择。
  • 默认值。
  • 生成使用帮助消息。
import sys

print("\n".join(sys.argv))

sys.argv是一个列表,其中包含在命令行上传递给脚本的所有参数。

基本上,

import sys
print(sys.argv[1:])

解决方法

Python程序员可以通过哪些方式做到这一点?

我们今天的关于如何在Python中处理命令行参数?python3 命令行参数的分享已经告一段落,感谢您的关注,如果您想了解更多关于python 命令行参数处理、python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一、python-如何使用命令行在pytest中传递多个参数?、Python-如何读取/处理命令行参数?的相关信息,请在本站查询。

本文标签: