我想只从Windows net中获取与我相关的cmd的行。
如果UNC路径是长网使用会断线
我的代码:
output = subprocess.Popen('net use', stdout=subprocess.PIPE).communicate()
valid_lines = [ line.strip() for line in output[0].split('\r\n')]
valid_lines = valid_lines[6:-3]
print "output", valid_lines
净使用样本:
输出['Getrennt \\ 192.168.1.111 \ bze \ export','Microsoft Windows Network', '确定\\ master \ bze \ export Microsoft Windows Network']
我想从第一行开始输出,比如'OK .....'
THX
答案 0 :(得分:0)
正如Andrew Medico所指出的那样,有这样的API,如果可能的话,调用一个旨在将信息返回给程序的函数比试图解析输入的函数要好得多。为人类格式化(因为后者可能过于复杂 - 正如你在这里看到的那样 - 甚至是模棱两可的)。
但这是可行的。你只需要弄清楚规则是为了延续线路。
看起来规则很简单:如果第一列为空,则该行是前一行的延续。
如果是这样的话:
prev_line = ''
for line in valid_lines:
if line[0]:
if prev_line:
print prev_line
prev_line = ''
else:
prev_line += line
你可以使用itertools.groupby
使这个更简洁,更具可读性,冒着使新手难以理解的风险,所以我选择了显式循环。
您还可以通过滥用解析器来获取具有兼容延续行格式的协议来作弊;例如,rfc822
模块。但最终这可能会做更多的工作而不是更少。
答案 1 :(得分:0)
这是一个很好的问题,如果您的操作系统支持WMIC命令,我找到了更好,更可靠的方法。我相信从Windows XP开始,这是受支持的,但您可以检查您的特定系统。使用WMIC,您可以将输出格式化为csv,并获得完全可靠的信息。示例代码如下:
import subprocess
output = subprocess.Popen('wmic netuse list /format:csv', stdout=subprocess.PIPE).communicate()
valid_lines = [ line.strip() for line in output[0].split('\r\n')]
#If you don't want the header use 2: instead of 1:
myData=[line.split(',') for line in valid_lines][1:]