从optparse切换到argparse后 – 我遇到了奇怪的错误. Argparse仅在不留空间时解析args:
myScript.py -oOpt

或者给出一个等号:

myScript.py -o=Opt

并且它不能正常工作:

myScript.py -o Opt

这是我的argparse初始化:

#!/usr/bin/env python
# to get description use the -h flag

import argparse,os,sys


# ======================
# Python2.7 is expected:

if sys.version_info[0] != 2 or sys.version_info[1] < 7:
    sys.exit('This program needs Python2.7+')


# ==========
# preambule:

desc = """Enter dirs in the current dir and makes gro out of state.cpt there."""
# parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description=desc,version='2.3',formatter_class=argparse.ArgumentDefaultsHelpformatter)
parser.add_argument('-w','--workWith',help = 'to specify a Gromacs exec suffix',dest = 'wW',action = 'store',default = '-4.5.5-single',)
parser.add_argument('-g','--gro',help = '.gro postfix: <nameOfTheDir><postfix>.gro',dest = 'myGroPostfix',default = "_membrane",)
parser.add_argument('-H','--here',help = 'toggles - single (current) dir behavIoUr (the output will be state.gro)',dest = 'Here',action = 'store_true',)
parser.add_argument('-D','--dirs',help = 'include these dirs (python\'s rgxp in SINGLE quotes),defaults to \'\'',dest = 'inclDirs',default = '',)

args = parser.parse_args()


print args.wW

编辑:

更:

gmx_bk-simulate-mems.py -j bk-runs-mpi.bash -p 1 -w="-4.5.5-double_non-parallel_gcc" 2&> ../`date +%Y-%b-%d-%H%M%s`.log &

得到:

gmx_bk-simulate-mems.py: error: unrecognized arguments: 2

它看起来像argparse对待2&>作为选项(或2&>和../date%Y-%b-%d-%H%M%S.log作为选项)!

编辑2:

总结一下:

>对于argparse – “-4.5.5-double_non-parallel_gcc”是一个错误的选项名称 – 这就是它需要写的原因是-w =“ – 4.5.5-double_non-parallel_gcc”.对于optparse和bash(!),这很好. bash甚至在-w =“ – 4.5.5-double_non-parallel_gcc”中给出错误 – 它认为arg是=“ – 4.5.5-double_non-parallel_gcc”(!);
>没有2&>这样的东西. 2 – ;应该使用,它没有错误;
>这是shell将行拆分为args而不是python;
> argparse比optparse好多了.

解决方法

首先,有必要进行小的区分. argparse模块不解析命令行参数,shell也是如此. shell负责将您在shell中键入的行转换为标记,然后将标记传递给sys.argv,这是一个python数组/命令行参数序列. argparse模块只是理解sys.argv中出现的内容.

这种区别将澄清您注意到的两个“错误”.首先,考虑-w“-4.5.5-double_non-parallel_gcc”(注意缺少等号). shell将这两个标记解析为-w和-4.5.5-double_non-parallel_gcc,并将这两个字符串传递给sys.argv.没有等号,这似乎是两个选项:-w(没有参数)和-4,以.5.5-double_non-parallel_gcc作为参数.您需要等号,以便将所有内容解析为单个令牌.

编辑部分

对于2&>,argparse不可能控制给定的令牌是否被视为参数.如果sys.argv中出现某些内容,则表示您的shell将其视为参数.

这里的告示标志是错误消息.请注意,消息不是无法识别的参数:2&>,而是无法识别的参数:2.您的shell识别“&>”作为输出重定向,并相应地解析该行的其余部分(包括日志文件).传递的唯一参数是“2”,因为2&>不是真正的重定向类型. (&>已经涵盖了stderr和stdout,那么2会添加什么?)

在评论中,您声称optparse可以“处理”“2&>”.事实并非如此. optparse模块完全与argparse完成的工作相同,但optparse不会像argparse那样验证位置参数.事实上,optparse正在让一个真正的编程错误(在这种情况下,使用2&>作为一种shell重定向)无法检测到!您应该发布原始的optparse代码,但我怀疑您解析了您的参数,如下所示:

opt,args = parser.parse_args()

你的脚本没有位置参数,所以我想你之后没有做任何其他的args.但是如果你要检查args,你会发现2被认为是位置参数!

通常,如果脚本不使用位置参数并且您使用optparse,则最好验证您没有收到位置参数,args = parser.parse_args() if args: parser.error("script takes no positional arguments")

argparse模块可以为你工作,这使得它远远超过optparse(以及其他原因).

Python:从optparse切换到argparse的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. 为什么PATH不适用于从Xcode执行的自定义shell脚本?

    我观察到Xcode在运行脚本阶段执行的自定义shell脚本没有设置任何环境变量.他们有很多其他变量,但不是PATH.有可能解决这个问题,怎么样?我只想运行一个应该在路径中的工具,我不想开始手动检查可能的位置.解决方法你可以明确地找到用户.bashrc,.profile等.或者更好的是,运行类似的东西这不会有污染其他变量的风险.

  3. ios – Xcode Server 4.0 git从构建触发脚本推送

    我为一个托管在github上的项目安装了一个XcodeBot.我按照步骤和设置机器人来使用我现有的SSH密钥.验证成功,项目结算和建立.然后,我在预触发器操作中添加了一个shell脚本,它增加了plist中的版本,将其标记,并将该更改提交到github.但是当我尝试从shell脚本执行gitpush时,我得到:–推送到git@github.com:spex-app/spex-ios.git权限被拒

  4. ios – 超时等待120秒的模拟器启动

    看起来像Teamcity代理(TC版本是9.0EAP)不能通过测试shell脚本运行iOS模拟器.我正在使用BuildStep:命令行,它运行自定义脚本并将参数传递给它.通过使用shell脚本../bin/mac.launchd.sh,在MacOSXYosemite10.10上启动了Teamcity代理.构建日志错误:我的shell脚本进行测试:我也试过从这个question的解决方案,但没有帮助

  5. 在附加到XCode项目的shell脚本中无法识别$SRCROOT

    尝试运行附加到我的xcode项目的简单脚本,如下所示……如果我在XCode之外运行脚本似乎运行正常但是从XCode运行时我收到以下错误…似乎SRCROOT变量在脚本中是不可检测的,但我的理解是这是应该传递并可由脚本访问的环境变量之一.任何想法?解决方法原来这是我的错.该剧本实际上根本没有被调用.在XCode中,我指的是使用脚本的路径…更正了问题,我现在可以从我的脚本访问$SRCROOT.

  6. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  7. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  8. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部