我正在尝试使用以下代码从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()
输出返回为字符串和
不是一组字符。
答案 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