在本文中,我们将给您介绍关于如何在Python中处理命令行参数?的详细内容,并且为您解答python3命令行参数的相关问题,此外,我们还将为您提供关于python命令行参数处理、python如何优雅的
在本文中,我们将给您介绍关于如何在Python中处理命令行参数?的详细内容,并且为您解答python3 命令行参数的相关问题,此外,我们还将为您提供关于python 命令行参数处理、python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一、python-如何使用命令行在pytest中传递多个参数?、Python-如何读取/处理命令行参数?的知识。
本文目录一览:- 如何在Python中处理命令行参数?(python3 命令行参数)
- python 命令行参数处理
- python 如何优雅的解析和管理命令行参数, 全网最优雅, 没有之一
- python-如何使用命令行在pytest中传递多个参数?
- Python-如何读取/处理命令行参数?
如何在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 命令行参数处理
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程序时,程序中经常会提供多种功能或者模式,在实际使用时根据不同的参数使用不同的功能。那么如何获取命令行传入进来的参数呢?
一般方法
一般情况下,我们会使用 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 信息,可以查阅到相关的使用说明,如
如,我们通过 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(''运算''))
上面的代码运行效果如:
当我们在命令行中使用 -h 参数时,还会有相应的参数帮助提示,如
当我们输入的参数不正确时,还有相应的错误提示,如
这么多功能,相对于我们输入的代码量来说,是不是物超所值?优雅至极?
百尺杆头,更进一步
上面的代码中,我们通过 入参.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中传递多个参数?
我想将输入作为命令行选项传递给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-如何读取/处理命令行参数??
标准库中的规范解决方案是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-如何读取/处理命令行参数?的相关信息,请在本站查询。
本文标签: