【问题标题】:using a list from subprocess output使用来自子流程输出的列表
【发布时间】:2017-08-02 18:58:26
【问题描述】:

我在以下脚本中使用了 subprocess 和 python3:

import subprocess

proc = subprocess.Popen("fail2ban-client -d".split(' '), stdout=subprocess.PIPE)
out, err = proc.communicate()
out.decode('ascii')
print(out)

输出如下:

['set', 'syslogsocket', 'auto']
['set', 'loglevel', 'INFO']
['set', 'logtarget', '/var/log/fail2ban.log']
['set', 'dbfile', '/var/lib/fail2ban/fail2ban.sqlite3']
['set', 'dbpurgeage', 86400]
...

我的问题是所有这些输出都不是列表。这只是一个带有新行的非常大的字符串。 我尝试使用以下命令将每一行转换为列表:

eval(out.decode('ascii').split('\n')[0])

但我认为这不是好方法。 所以我的问题是如何将字符串(看起来像列表)转换为列表。

【问题讨论】:

    标签: python-3.x fail2ban


    【解决方案1】:

    虽然人们通常害怕使用eval,但如果您需要将文本文字转换为数据,它的方法。无需拆分(可能很长)字符串,您可以像这样简单地读取第一行:

    import io
    f = io.StringIO(out.decode('ascii'))
    first_list = eval(f.readline())
    second_list = eval(f.readline())
    

    【讨论】:

    • 既然有ast.literal_eval,为什么还要使用eval
    • 啊,很好。是的,将eval 替换为ast.literal_eval 以获得更安全的代码。并且不要忘记先导入ast
    猜你喜欢
    • 2019-06-03
    • 2014-10-06
    • 1970-01-01
    • 2017-04-18
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多