使用子进程输出的列表
using a list from subprocess output
我在以下脚本中使用子进程和 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])
但我认为这不是好方法。
所以我的问题是如何将字符串(看起来像列表)转换为列表。
虽然人们通常害怕使用 eval
,但如果您需要将文本文字转换为数据, 是一种选择。您可以像这样简单地读出第一行,而不是拆分您的(可能很长的)字符串:
import io
f = io.StringIO(out.decode('ascii'))
first_list = eval(f.readline())
second_list = eval(f.readline())
我在以下脚本中使用子进程和 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])
但我认为这不是好方法。 所以我的问题是如何将字符串(看起来像列表)转换为列表。
虽然人们通常害怕使用 eval
,但如果您需要将文本文字转换为数据, 是一种选择。您可以像这样简单地读出第一行,而不是拆分您的(可能很长的)字符串:
import io
f = io.StringIO(out.decode('ascii'))
first_list = eval(f.readline())
second_list = eval(f.readline())