2015-12-22 167 views
2

我試圖用subprocess.popen在我的機器上運行命令。subprocess popen運行命令(HDFS/hadoop)

這是我迄今爲止

cmdvec = ['/usr/bin/hdfs', 'dfs', '-text', '/data/ds_abc/clickstream/{d_20151221-2300}/*', '|', 'wc', '-l'] 

subproc = subprocess.Popen(cmdvec, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.STDOUT) 

如果我在終端運行命令我得到的

15/12/21 16:09:31 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library 
15/12/21 16:09:31 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 9cd4009fb896ac12418449e4678e16eaaa3d5e0a] 
15/12/21 16:09:31 INFO compress.CodecPool: Got brand-new decompressor [.snappy] 
15305 

輸出數量15305理想值我想要的。

當我通過拆分它,並把它轉換成一個列表運行的命令,我這樣做是爲了試圖讓行:

for i in subproc.stdout: 
    print(i) 

然而,這給我的數據,就好像這個命令是跑,因爲所有正在顯示來自文件的數據。

/usr/bin/hdfs dfs -text /data/ds_abc/clickstream/{d_20151221-2300}/*

它似乎並不像|已被用來計算行數管在所有文件

+1

相關:我如何使用subprocess.Popen通過管道多個進程連接(http://stackoverflow.com/q/295459/4279) – jfs

回答

3

在你的榜樣,通過管道|字符作爲參數傳遞給subprocess.Popen並不像Bash那樣創建一個流程管道。相反,管道|字符正被傳遞給單個進程的參數。

相反,您需要將兩個獨立的subprocess.Popen調用鏈接在一起以模擬Bash風格的管道。關於subprocess模塊的文檔包含更多詳細信息。

https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline