如何将os.system()输出作为字符串而不是一组字符?

时间:2017-02-14 13:06:56

标签: python linux shell popen os.system

我正在尝试使用以下代码从os.system获取输出:

p = subprocess.Popen([some_directory], stdout=subprocess.PIPE, shell=True)
ls = p.communicate()[0]

当我打印输出时,我得到:

> print (ls)
file1.txt
file2.txt

输出以某种方式显示为两个单独的字符串,但是,当我尝试使用for循环打印出文件名字符串时,我得到 而是一个字符列表:

>> for i in range(len(ls)):
>        print i, ls[i]

输出:

0 f
1 i
2 l
3 e
4 1
5 .
6 t
7 x
8 t
9 f
10 i
11 l
12 e
13 2
14 .
15 t
16 x
17 t

我需要帮助确保os.system()输出返回为字符串和 不是一组字符。

3 个答案:

答案 0 :(得分:1)

p.communicate会返回字符串。它可能看起来像文件名列表,但它只是一个字符串。您可以通过拆分换行符来将其转换为文件名列表:

s = p.communicate()[0]
for line in s.split("\n"):
    print "line:", line

您是否知道有内置函数可以获取目录中的文件列表?

答案 1 :(得分:0)

for i in range(len(...)):通常是Python中的代码味道。如果要迭代集合的编号元素,则规范方法为for i, element in enumerate(...):

您明确引用的代码不是您运行的代码,因为当您打印ls时,您会看到由换行符分隔的两行,但是当您遍历字符串的字符时,换行符不会出现

底线是 communicate()[0]获取字符串,但是您正在迭代它,为您提供单独的字符。我怀疑您想要做的是使用.splt()上的.splitlines()ls方法来获取单个文件名,但是您可以尝试在行走之前运行。最重要的是,明确处理communicate方法返回给你的内容。

答案 2 :(得分:0)

显然,在Python 3.6中,p.communicate返回 bytes 对象:

.as-console-wrapper { max-height: 100% !important; top: 0; }

以下似乎效果更好:

In [16]: type(ls)
Out[16]: bytes

但我宁愿使用In [22]: p = subprocess.Popen([some_directory], stdout=subprocess.PIPE, shell=True) In [23]: ls = p.communicate()[0].split() In [25]: for i in range(len(ls)): ...: print(i, ls[i]) ...: 0 b'file1.txt' 1 b'file2.txt' 代替os.listdir()

subprocess