Python argparse 参数:传递包含连字符的字符串的问题

Posted

技术标签:

【中文标题】Python argparse 参数:传递包含连字符的字符串的问题【英文标题】:Python argparse arguments: issue with passing strings containing hyphens 【发布时间】:2015-07-06 08:39:58 【问题描述】:

今天我的 python 代码遇到了一个奇怪的行为。我写了下面这个小程序来说明。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--list1", "-l1", nargs='+',  help="liste 1",   metavar="THE_LIST")

args = parser.parse_args()

if args.list1:
    print("list1:" + str(args.list1))

我在第一台服务器上运行代码。我得到了预期的行为(list1 包含一个包含“-V”的字符串)。

$ uname -a
Linux computer 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ python  --version
Python 2.7.3
$ cat test.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--list1", "-l1",  help="liste 1", metavar="THE_LIST")

args = parser.parse_args()

if args.list1:
    print("list1:" + str(args.list1))
$ python test.py -l1 "abc -V def"
list1:abc -V def

我在第二台服务器(Centos 6.6)上运行它并得到一个错误。连字符似乎被视为附加参数的一部分,尽管 -l1 的值仍然用双引号括起来......任何想法都会非常感激......

$ uname -a
Linux sacapus 2.6.32-504.12.2.el6.x86_64 #1 SMP Wed Mar 11 22:03:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ python --version
Python 2.7.9
$ cat test.py 
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--list1", "-l1",  help="liste 1", metavar="THE_LIST")

args = parser.parse_args()

if args.list1:
    print("list1:" + str(args.list1))
$ python test.py -l1 "abc -V def"
usage: test.py [-h] [--list1 THE_LIST]
test.py: error: unrecognized arguments: -V def

【问题讨论】:

在我看来,这更像是你的 shell/OS 的问题,而不是 Python 的问题。添加了一些标签,如果有帮助请随时修改 在 Python 2.7.6 上使用 bash、ksh、csh 和 fish 为我工作。 我必须同意@IanClark;这似乎是一个外壳问题。我通常运行 Linux,但是当我遇到这个时碰巧在 Windows 机器上。我无法在 Windows 下复制错误。 【参考方案1】:

这真的不应该发生。为了弄清楚发生了什么,我会包括

print(repr(sys.argv))

在脚本的开头,判断 "abc -V def" 字符串是否真的被 shell 作为单个参数传递。

如果它作为单个参数到达您的程序,则责备argparse,否则您的 shell 会搞砸。不管怎样,这似乎应该成为 CentOS 的错误数据库中的一个条目。

FWIW,我无法使用 Python 2.7.9 在 Debian Jessie 上重现此内容:

greek0@orest:/tmp$ python2.7 a.py -l1 "abc -V def"
list1:['abc -V def']

【讨论】:

在 centos 服务器上添加 print(repr(sys.argv)) 给我 ['test.py', '-l1', 'abc', '-V', 'def']。 ... 可能与 Centos 上的 Python 安装有关。我在使用此服务器上安装的 Python 3.3.5 版本时遇到了同样的错误... 那么print(repr(sys.argv)) 打印了什么? 我在第二台服务器上得到了 ['test.py', '-l1', 'abc', '-V', 'def'],而它给了我预期的输出(['test .py', '-l1', 'abc -V def']) 在第一个。 就是这样。 python 可执行文件已替换为包含以下内容的 shell 脚本:#!/bin/sh LD_LIBRARY_PATH=/Softs/users/Python-2.7.9/binaries/lib//Softs/users/Python-2.7.9/binaries/bin/ python2.7ld(其中 python2.7ld 是原始 python 可执行文件) @ChristianAichinger:最简单的方法是找出你使用的shell是ps(无参数)。

以上是关于Python argparse 参数:传递包含连字符的字符串的问题的主要内容,如果未能解决你的问题,请参考以下文章

python中的argparse模块怎么参数传递

如何在 Python 中使用 argparse 传递 Shell 脚本样式参数

python argh/argparse:如何将列表作为命令行参数传递?

如何通过批处理文件执行 Python 代码并传递参数 - 使用 argparse

如何使用 argparse Python 在 SQL 查询中传递日期范围参数

使用 argparser 将参数传递给入口点 python 脚本