【问题标题】:Python argparse arguments: issue with passing strings containing hyphensPython argparse 参数:传递包含连字符的字符串的问题
【发布时间】: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 下复制错误。

标签: python shell centos argparse hyphen


【解决方案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(无参数)。
猜你喜欢
  • 1970-01-01
  • 2015-04-18
  • 2012-12-02
  • 2020-11-29
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多