我正在创建一个脚本,它使用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)
任何人都可以解释为什么它不检查位置参数?
在一个文件中(比方说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) 我有一个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方式吗?
我正在尝试使用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地址。
有人知道我在做什么错吗?谢谢!
我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)
那可能吗?
举个例子:
#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)
基本上,如果符合以下条件,我想做不同的事情:
default="foo"在add_argument中使用不起作用,因为它在测试时总是存在 - 我无法知道用户是否实际指定了选项"--show".
我想执行一个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']
如默认参数中所述
所以有两件事我不能在这里工作:
谢谢您的帮助
如何在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的新手),如果有人能告诉我如何正确传递这样的字符串,我会极大地贬低它.
在我的项目中,我使用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
我正在为脚本编写一个小的命令行实用程序,但无法弄清楚如何从参数中正确获取完整路径。
这就是我的意思。
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,可以从相对路径获取完整路径?
argparse ×10
python ×10
python-2.7 ×3
entry-point ×1
hex ×1
pyinstaller ×1
python-3.x ×1
setup.py ×1
string ×1