2017-02-14 14 views
-1

我用下面的代碼試圖從os.system得到輸出如何獲取os.system()輸出爲字符串而不是一組字符?</p> <pre><code>p = subprocess.Popen([some_directory], stdout=subprocess.PIPE, shell=True) ls = p.communicate()[0] </code></pre> <p>當我打印輸出我得到:

> 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()輸出返回字符串和 不是一組字符。

回答

1

p.communicate返回a 字符串。它可能看起來像一個文件名列表,但它只是一個字符串。你可以將它通過分裂在換行字符轉換爲文件名的列表:

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

您是否知道有內置的函數來獲取文件的目錄列表?

+0

嗨,布賴恩。非常感謝。這解決了我的問題。我知道其他內置函數。我正在從服務器更新文件,需要能夠檢查任何新的文件更新。想到關於新的分割線,但不知道它會工作,因爲我還是很新的python ssh。 –

0

for i in range(len(...)):通常是Python中的代碼異味。如果你想迭代一個集合的編號元素到規範方法是for i, element in enumerate(...):

您明確引用的代碼不是您運行的代碼,因爲當您打印ls時,會看到由換行符分隔的兩行,但是當您遍歷字符串的字符時,不會顯示換行符。

底線是你communicate()[0]得到一個字符串,但是你在迭代它,給你單獨的字符。我懷疑你想要做的是使用或.splitlines()方法ls來獲取單個文件名,但你正在嘗試運行,然後才能走。最重要的是,清楚地掌握communicate方法返回給您的內容。

0

顯然,在Python 3.6,p.communicate返回字節對象:

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

import os 
for line in os.listdir(): 
    print line 
相關問題