标签: argparse

argparse不检查位置参数

我正在创建一个脚本,它使用argparse获取位置和可选参数.我已经阅读了Doug的教程和python文档,但找不到答案.

parser = argparse.ArgumentParser(description='script to run')
parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt'),
parser.add_argument('inputString', action='store', nargs='?') 
parser.add_argument('-option1', metavar='percent', type=float, action='store')
parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w'),
parser.add_argument('-option3', action='store', default='<10',
args = parser.parse_args()
# rest of script.... blah blah
Run Code Online (Sandbox Code Playgroud)

如您所见,我想要2个位置和3个可选参数.但是,当我尝试在终端中运行它时,它不会检查位置!如果我尝试:python script.py inputfile它将正常运行并在脚本无法找到inputString的值时输出错误.如果我尝试:python script.py xxx; 输出是:

usage script.py [-h] [-option1] [-option2] [-option3]
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么它不检查位置参数?

python optional-arguments argparse

2
推荐指数
1
解决办法
2320
查看次数

从unittest测试调用时,argparse失败

在一个文件中(比方说parser.py)我有:

import argparse

def parse_cmdline(cmdline=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('--first-param',help="Does foo.")
    parser.add_argument('--second-param',help="Does bar.")

    if cmdline is not None:
        args = parser.parse_args(cmdline)
    else:
        args = parser.parse_args()

    return vars(args)

if __name__=='__main__':
    print parse_cmdline()
Run Code Online (Sandbox Code Playgroud)

果然,当从命令行调用它时,它会起作用并给我很多我期望的东西:

$ ./parser.py --first-param 123 --second-param 456
{'first_param': '123', 'second_param': '456'}
Run Code Online (Sandbox Code Playgroud)

但后来我想要unittest它,因此我写了一个test_parser.py文件:

import unittest
from parser import parse_cmdline

class TestParser(unittest.TestCase):
    def test_parse_cmdline(self):
        parsed = parse_cmdline("--first-param 123 --second-param 456")

        self.assertEqual(parsed['first_param'],'123')
        self.assertEqual(parsed['second_param'],'456')

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

usage: test_parser.py [-h] [--first-param FIRST_PARAM]
                      [--second-param SECOND_PARAM]
test_parser.py: …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 argparse python-unittest

2
推荐指数
1
解决办法
4384
查看次数

Python argparse解析无法识别的参数

我有一个3-4个参数的解析器,效果很好.我想为脚本提供未知数量的额外参数,这些参数将被加载到模板中.我已经阅读了argparse文档,但我不确定它是否可行.我可以parse_known_arguments(),但我仍然需要自己处理["--placeholder1", "value1", "--placeholder2", "value2", ...]数组.我应该继续这样做,还是有更多的pythonic方式?

就在我的头顶:

parser = argparse.ArgumentParser()
parser.add_argument("--template", required=True)
parser.add_argument("--location", required=True)
args,unknown = parser.parse_known_arguments()
tpl = LoadTemplate(args.template)

# Missing part where I transform unknown into an dict or namespace called extraarguments
raw = tpl.render(extraarguments)

# Print into args.location raw
render.py --template template1 --location /path/to/invoices --author John --customer Customer1 --title "Your invoice is ready!"
render.py --template template2 --location /path/to/newsletter --customer Customer2 --sender john@store.com --subject "Weekly newsletter"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,template并且location必须存在,但额外的参数应该是解压缩并送入模板渲染功能.它看起来像一个单行,但是有更多的pythonic方式吗?

python python-2.7 argparse

2
推荐指数
1
解决办法
1513
查看次数

python argparse十六进制错误

我正在尝试使用argparser读取我的python脚本所需的一些十六进制值,示例输入如下所示:

parser.add_argument("start", type=hex, help="hex PC address you want to start recording data")
Run Code Online (Sandbox Code Playgroud)

当我尝试以十六进制值启动脚本时,会发生问题。例:

python testscript.py 0x21c
Run Code Online (Sandbox Code Playgroud)

然后ik得到错误:

 error: argument start: invalid hex value: '0x21c'
Run Code Online (Sandbox Code Playgroud)

还尝试使用以下值:0X21C,21C,21c,21。所有这些都会导致相同的错误。

编辑:我不愿意将十六进制值转换为整数。我只需要输入的十六进制值即可。它是µC需要跳转到的PC地址。

有人知道我在做什么错吗?谢谢!

python hex argparse

2
推荐指数
1
解决办法
1918
查看次数

如何从python脚本设置argparse参数

main在包的setup.py内部指定了一个函数作为入口点,该函数使用该argparse包来传递命令行参数(请参见此处的讨论):

# file with main routine specified as entry point in setup.py
import argparse
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('a', type=str, help='mandatory argument a')
    args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想main在软件包的测试中使用此处建议的相同功能。在后一种情况下,我想main从测试类中调用函数,并在函数调用之前设置(某些)命令行参数(否则会由于缺少参数而失败)。

# file in the tests folder calling the above main function
class TestConsole(TestCase):
    def test_basic(self):
        set_value_of_a()
        main()
Run Code Online (Sandbox Code Playgroud)

那可能吗?

python entry-point setup.py argparse

2
推荐指数
1
解决办法
3076
查看次数

Argparse - 区分没有选项,调用选项和使用参数调用的选项?

举个例子:

#thing.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--show", nargs='?', action="store")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

如何区分以下用法:

python thing.py

python thing.py --show

python thing.py --show all
Run Code Online (Sandbox Code Playgroud)

基本上,如果符合以下条件,我想做不同的事情:

  • 用户不指定选项
  • 用户自己指定"--show"选项
  • 用户使用字符串/参数指定"--show all".

default="foo"在add_argument中使用不起作用,因为它在测试时总是存在 - 我无法知道用户是否实际指定了选项"--show".

python argparse

2
推荐指数
1
解决办法
368
查看次数

将一个IP列表解析为python中的argparse为字符串

我想执行一个python脚本,它可以处理多个IP地址.这些地址可以通过commad line给出.

我使用以下命令进行解析:

parser.add_argument('--IP',dest='Adresses',help='some Ips', 
default=['192.168.2.15','192.168.2.3'],type=list,nargs='+')
Run Code Online (Sandbox Code Playgroud)

但是,当我通过如下命令运行脚本时:

python script.py --IP 192.168.2.15,192.168.2.3
Run Code Online (Sandbox Code Playgroud)

它在每个字符之后拆分字符串,如果我使用空格而不是逗号,则会发生相同的行为,因此如果我将其打印出来,则会发生以下输出

[['1','9','2','.','1','6','8','.','2','.','1','5'] ,['1','9','2','.','1','6','8','.','2','.','3']]

我希望拥有的是:

[ '192.168.2.15', '192.168.2.3']

如默认参数中所述

所以有两件事我不能在这里工作:

  1. 我如何解析几个字符串到argparse但在一个参数下,以便它在列表中分离
  2. 如何通过字符停止分割

谢谢您的帮助

python string argparse

2
推荐指数
1
解决办法
1286
查看次数

如何在没有"namespace"的情况下在python中传递字符串作为参数

如何在python中传递一个字符串作为参数而不包含"Namespace"的输出.

这是我的代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("person", help="person to test",type=str)
person = str(parser.parse_args())
print "The person's name is " + person 
Run Code Online (Sandbox Code Playgroud)

这是我正在运行的命令:

python test.py bob
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

The person's name is Namespace(person='bob')
Run Code Online (Sandbox Code Playgroud)

我可能会做一些花哨的分裂,但我确定我只是错误地利用了argparse(我是python的新手),如果有人能告诉我如何正确传递这样的字符串,我会极大地贬低它.

python argparse

2
推荐指数
1
解决办法
3387
查看次数

Python多重处理使用argparse和pyinstaller引发错误

在我的项目中,我使用argprse传递参数,而在脚本中的某个地方使用多重处理来完成其余的计算。如果我从命令提示符处调用脚本,则脚本工作正常。

python complete_script.py --arg1=xy --arg2=yz”。

但是在使用Pyinstaller使用命令“ pyinstaller --onefile complete_script.py”将其转换为exe后,它将抛出

错误

“错误:无法识别的参数:--multiprocessing-fork 1448”

任何建议,我如何使这项工作。或任何其他选择。我的目标是创建一个exe应用程序,可以在未安装Python的其他系统中调用该应用程序。

以下是我的工作站的详细信息:

Platform: Windows 10
Python : 2.7.13 <installed using Anaconda>
multiprocessing : 0.70a1
argparse:   1.1
Run Code Online (Sandbox Code Playgroud)

从评论中复制:

def main():
     main_parser = argparse.ArgumentParser()
     < added up arguments here>
    all_inputs = main_parser.parse_args()
    wrap_function(all_inputs)


def wrap_function(all_inputs):
    <Some calculation here >
   distribute_function(<input array for multiprocessing>)

def distribute_function(<input array>):
    pool = Pool(process = cpu_count)
    jobs = [pool.apply_async(target_functions, args = (i,) for i in input_array)]
    pool.close()
Run Code Online (Sandbox Code Playgroud)

python pyinstaller python-2.7 argparse python-multiprocessing

2
推荐指数
2
解决办法
1585
查看次数

使用Argparse从相对路径获取完整路径

我正在为脚本编写一个小的命令行实用程序,但无法弄清楚如何从参数中正确获取完整路径。

这就是我的意思。

parser = ArgumentParser()
parser.add_argument("-src",
                    required = True, help="path to some folder")
args = parser.parse_args()
print(args.src)
Run Code Online (Sandbox Code Playgroud)

如果用户通过完整路径,例如"/home/username/projectname/folder",一切都很好。

但是,如果用户从假设"projectname"文件夹运行脚本并传递相对路径,则"./folder""./folder"在解析参数而不是完整路径时会得到完全相同的字符串"/home/username/projectname/folder"

因此,我一直想知道是否存在某种内置功能Argparse,可以从相对路径获取完整路径?

python argparse python-3.x

2
推荐指数
2
解决办法
483
查看次数