【问题标题】:How to add support of multi-line arguments for Python scripts using argparse?如何使用 argparse 添加对 Python 脚本的多行参数的支持?
【发布时间】:2013-06-04 05:39:33
【问题描述】:

我刚刚创建了a Python project,它使用argparse 来解析参数。但它似乎不支持多行参数。可以查看项目中的example/command-line.sh,会发现看不懂下面的样式

#!/bin/bash
../scripts_gen.py --template template.txt \
                  --save-to scripts \
                  --param "{'data':'datasets.txt', \
                            'lambda':[`echo 0.{0..9}|sed -E 's/\s+/,/g'`], \
                            'seed':[233,874]}" \
                  --format "{data}_lambda={lambda}_seed={seed}.sh" \
                  --delete

请注意,这在 shell 脚本中是合法的:总是可以写

$ ls -l \
> -f

在控制台或 shell 脚本文件中(在这种情况下没有提示)。那么我可以通过argparse 添加对此的支持吗?谢谢。

【问题讨论】:

  • 这应该没问题。你看到什么错误?您可能不需要引用字符串中的 ``。
  • @SethMMorton 在上面的示例中,我将看到 Python 脚本可以识别第一个参数 --template,但忽略其余的。然后shell后来抱怨它找不到像--save-to这样的命令......
  • 问题出在您的 bash 脚本中。如果它按预期工作,python 甚至不会知道参数之间有换行符——shell 会处理它并删除换行符。第一个反斜杠后很可能有一个空格。
  • @alexis 我使用的是 Cygwin,但后来尝试了 Debian 7.0,看起来还可以。这可能是 Cygwin 的问题。但是Cygwin可以识别ls这个例子,所以还是有点奇怪。
  • 好的,如果 same 文件在 Debian 上工作正常,那么它不是反斜杠后面的空格。可能是脚本中的行尾有问题?

标签: python command-line-arguments argparse


【解决方案1】:

事后回答,基于我的 cmets:

  1. 问题出在您的 bash 脚本中。如果它按预期工作,python 甚至不会知道参数之间有换行符——shell 会处理它并删除换行符。第一个反斜杠后很可能有一个空格。

  2. 但是由于同一个文件在 Debian 上可以正常工作,但在 cygwin 下失败,所以它不是反斜杠后面的空格。可能是脚本中的行尾有问题?

  3. 所以,问题在于git 自动转换CR/LF,再加上cygwin 奇怪地拒绝了解其主机操作系统的行尾约定。虽然您通过将脚本手动转换回 unix 行结尾来修复它,但我会推荐一个更强大的解决方案:您可以在 cygwin 中启用 CR/LF 支持(因为您暗示它是一个选项),但我的偏好是还禁用 git 的 CR/LF 映射。并检查所有常用工具和编辑器是否已配置为正确处理这两种换行符。

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2013-03-07
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2017-10-31
    • 2020-03-29
    • 2017-10-13
    • 2018-11-19
    相关资源
    最近更新 更多