【问题标题】:Passing directory paths as strings to argparse in Python在 Python 中将目录路径作为字符串传递给 argparse
【发布时间】:2019-01-09 13:55:23
【问题描述】:

场景:我有一个 python 脚本,它接收 2 个目录路径(输入和输出文件夹)和一个变量 ID 作为输入。有了这些,它从 xlsx 和 xlsm 宏执行数据收集过程,修改数据并保存到 csv(从输入文件夹,代码的内部函数将运行循环,以获取多个文件并处理它们,一个在时间)。

问题:因为当我从 Spyder 控制台运行代码时它运行良好,所以我决定加强它并了解 cmd caller、argparse 和 ma​​in 功能。我试图实现它,但我收到以下错误:

Unrecognized arguments (the output path I pass from cmd)

问题:关于我做错了什么有什么想法吗?

Obs:如果需要完整的脚本,我可以在这里发布,但由于它在从 Spyder 运行时有效,我相信错误出在我的 argparse 函数中。

代码(argparse 函数和 __main__):

# This is a function to parse arguments:
def parserfunc():
    import argparse
    parser = argparse.ArgumentParser(description='Process Files')
    parser.add_argument('strings', nargs=3)
    args = parser.parse_args()
    arguments = args.strings
    return arguments

# This is the main caller    
def main():
    arguments = parserfunc()
    # this next function is where I do the processing for the files, based on the paths and id provided):
    modifierfunc(arguments[0], arguments[1], arguments[2])

#
if __name__ == "__main__":
    main()

【问题讨论】:

  • 在您的情况下,您可以简单地使用 sys.argv 全局数组而无需任何解析
  • @grapes 确实,使用 sys.argv(现在我知道它存在)这变得非常简单,感谢分享信息。不过,我想知道我在 argparse 上做错了什么,所以我可以学习如何正确使用它。
  • 您的输出路径是否包含空格?如果是,这两个部分可以算作单独的参数,您将传递四个(或更多)而不是三个参数。在这种情况下,您应该正确引用或转义您的输入。你的解析功能对我有用。
  • 我不知道。但只需用script.py "input/file/Document with spaces.txt" output/file/Also\ with\ spaces.txt id 调用它,所以要么用引号括起你的参数,要么用反斜杠转义空格。
  • 调试argparse 代码时,显示sys.argv[1:]args(或所有argparse 错误消息)很有用。在这种情况下,sys.argv[1:] 应该有 3 个字符串。如果不是,则输入有问题 - 可能与 shell 如何拆分命令行有关。

标签: python cmd main argparse


【解决方案1】:

如果您决定使用argparse,则使用命名参数,而不是索引。以下是示例代码:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('input')
parser.add_argument('output')
parser.add_argument('id')

args = parser.parse_args()
print(args.input, args.output, args.id) # this is how you use them

如果您在程序启动时错过其中一个,您将收到类似人类可读的错误消息

错误:需要以下参数:id

【讨论】:

    【解决方案2】:

    您可以删除整个 parserfunc() 函数。 sys.argv 确实包含葡萄提到的所有参数(总是作为字符串处理)。

    所以不要这样:

    modifierfunc(arguments[0], arguments[1], arguments[2])
    

    这就足够了:

    import sys
    modifierfunc(sys.argv[0], sys.argv[1], sys.argv[2])
    

    也许,先打印一下,看看 sys.argv 是否包含您期望的值。

    print('Argument 0='+sys.argv[0])
    print('Argument 1='+sys.argv[1])
    print('Argument 2='+sys.argv[2])
    

    【讨论】:

    • 感谢@grapes 的编辑,在打印数据时...调用所有“参数 0”确实没有意义;=D
    • 我知道,这不是一个重要的编辑,但我碰巧在一个示例中因为一个简单的错字而被否决,所以我修复了它)
    • 这并不是讽刺@grapes。如果您对这么小的事情投了反对票,那么这些人可能心情不好。您正在尝试提供帮助,但每个人都会出现拼写错误。
    猜你喜欢
    • 2012-11-13
    • 2014-06-26
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2016-12-23
    • 2021-03-14
    相关资源
    最近更新 更多