2012-01-16 51 views
5

我想运行在Python 3以下的bash命令:蟒子输出到列表或文件

ls -l 

我知道我可以做到以下几点:

from subprocess import call 
call(['ls', '-l']) 

如何保存这输出到一个文件,或将其放入列表或集?

[-rw-r--r--] [1] [name] [staff] [426] [14 Jan 21:52] [HelloWorld.class] 
[[email protected]] [1] [name] [staff] [107] [14 Jan 21:51] [HelloWorld.java] 
... 
etc. 

我希望能够直接访问特定的信息,然后将其添加到组,但我不知道有多少项目将陆续上市。

任何提示,代码片段或示例都会有帮助。

+1

如果你想要访问文件/目录信息,您可能需要检查内置的'os'库:[documentation](http://docs.python.org/py3k/library/os.html)。 – 2012-01-16 13:47:59

回答

8

一种方式来访问信息在ls -l输出解析它。例如,csv.DictReader可以使用每一列映射到某个字段的字典:

import subprocess 
import csv 

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
stdout, stderr = process.communicate() 

reader = csv.DictReader(stdout.decode('ascii').splitlines(), 
         delimiter=' ', skipinitialspace=True, 
         fieldnames=['permissions', 'links', 
            'owner', 'group', 'size', 
            'date', 'time', 'name']) 

for row in reader: 
    print(row) 

上面的代码将打印一本字典的每一行中ls -l输出,如:

{'group': '<group_name>', 
'name': '<filename>', 
'links': '1', 
'date': '<modified_date>', 
'time': '<modified_time>', 
'owner': '<user_name>', 
'permissions': '-rw-rw-r--', 
'size': '<size>'} 
+0

我得到:'File“ip4.py” ,第16行 打印行 ^ SyntaxError:invalid syntax' – beoliver 2012-01-16 13:42:47

+0

@ user969617是的,对不起,这是针对python 2.x,而不是针对python 3的问题。我已经更新了python 3的代码。 – jcollado 2012-01-16 13:46:33

+0

这看起来很有希望!!!我的下一个问题(请裸露在我身边,这是我第二天的Python)是如何从每本字典中获取信息的。我需要给他们独特的名字吗?假设我想用电子表格交叉引用日期。 – beoliver 2012-01-16 13:50:57

0
from subprocess import Popen, PIPE 
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] 

然后,你可以做任何你想要的输出。见python docs的详细文档

+0

谢谢。我也尝试过这个,但是由于缺乏格式而感到困惑......我习惯于用bash&awk来做事情,在那里打印输出,然后用'awk'{print $ n;}''让你进入列,'awk NR = $ variable'让你选择行。我应该看哪一部分? – beoliver 2012-01-16 13:24:06

+0

@Gary指出了一个用于Python2.7 +的好方法。使用,如果你可以:) – Wesley 2012-01-16 13:28:43

18

随着python2.7,你可以使用subprocess.check_output

ls_lines = subprocess.check_output(['ls', '-l']).splitlines() 

此前python2.7,你需要使用较低级别的API,这是更复杂一些。

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
ls_proc.wait() 
# check return code 
ls_lines = ls_proc.stdout.readlines() 
1

阅读关于Popen。你问你镶有

import subprocess 
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
myset=set(proc.stdout) 

获取或做类似

for x in proc.stdout : print x 

与同为标准错误

您可以检查过程的状态

proc.poll() 

或等待它终止于

proc.wait() 

也读

read subprocess stdout line by line

4

如果你真正想要的是列出目录,而使用os.listdir

import os 
files = os.listdir('/path/to/dir') 
for file in files: 
    print(file) 
+0

我其实想列出机场表,但认为我会用一个简单的例子。实际的输出是'call('[/ System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport','-s'])' – beoliver 2012-01-16 13:29:05