【问题标题】:How to save python command line arguments to a log file?如何将 python 命令行参数保存到日志文件?
【发布时间】:2020-03-09 22:36:50
【问题描述】:

我有一个 python 脚本test.py,它有几十个参数/标志:--flag1--flag2、...、--flagn。为了运行它,我执行了类似

的命令
python test.py --flag1 value1 --flag3 value3 --flag8 value8

在这种情况下,我想将完全相同的输入行保存到日志文件中。在上面的例子中,我想要一个只包含一行的log.txt

python test.py --flag1 value1 --flag3 value3 --flag8 value8

因为这个脚本有几十个标志,其中一些被默认为一些值,我只关心用户的输入是什么,我不需要任何关于用户不需要的其他参数的默认值的信息t 直接指定。

如何创建这样的日志文件,其中包含用户键入的完全相同的行?

【问题讨论】:

    标签: python shell command-line-arguments


    【解决方案1】:

    您可以使用sys.argv 来捕获传递给脚本的所有参数:

    传递给 Python 脚本的命令行参数列表。

    例如:

    import sys
    print(sys.argv)
    print(" ".join(sys.argv))
    

    当你向这个脚本传递一些参数时,例如:

    my_script.py --foo --bar
    

    它会打印出来

    ['my_script.py', '--foo', '--bar']
    my_script.py --foo --bar
    

    更新:当带空格的引号字符串作为参数传递时,这不会打印@PeterMoore 提到的命令行的精确副本,因为在 Python 有机会检查它们之前,你的 shell 将删除引号。一个简单的解决方法可能是:

    print(" ".join(f"'{i}'" if " " in i else i for i in sys.argv))
    

    如果你也想包含 Python 可执行文件,你可以使用sys.executable:

    >>> print(sys.executable)
    /usr/bin/python
    

    【讨论】:

    • 如果您有类似my.py --my-str 'my string is' 的内容,这将无法正常工作,因为您会看到my.py --my-str my string is
    • @PeterMoore 没错。不幸的是,shell 会删除引号,并且无法恢复它们。更新了我的答案,以寻求涵盖一些简单案例的解决方法。
    • 但这也不会捕获“连字符”。但我发现工作只是使用 shelx.quote (" ".join(shlex.quote(arg) if [i in arg for i in " '"] else arg for arg in sys.argv)) 并解决了很多边缘情况。它将像连字符一样引用不平衡的单引号。
    • 我认为这会改善一切 (" ".join(quote(arg) for arg in sys.argv)) 但不确定。我厌倦了测试它:-)
    猜你喜欢
    • 2018-08-08
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多