2017-02-14 49 views
0

我在一個文件中有一些命令,我​​在python中讀取並使用subprocess.Popen執行。運行splitlines()方法時,生成的行數取決於終端屏幕的寬度。該文件中的命令是:Python拆分結果根據終端屏幕大小而變化?

CREATE EXTERNAL TABLE tableforview (name string, dob string) STORED AS PARQUET LOCATION 'location';

有文件中沒有換行;它全部輸入一行。

hivep = subprocess.Popen("beeline -u 'connectionstring' --force=true --outputformat=csv2 --showWarnings=false -f hivetest", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
(output, err) = hivep.communicate() 

hivequeryList = [] 
hivequery = "" 

for line in output.splitlines(): 
    print(line) 

但是,當我逐行打印splitlines()方法的輸出時,根據終端屏幕的大小,我得到兩行或三行。

我正在閱讀拆分成字典。所以我期望的是字典的關鍵字包含整個創建查詢以及包含結果的值。但正在發生的事情是查詢被截斷,像這樣

{"CREATE EXTERNAL TABLE tableforview (name string, dob string) STORED AS PARQUE" : "T LOCATION 'location';"}

而在這取決於我的終端屏幕有多寬是截止發生變化的位置。

我不知道爲什麼我的終端屏幕寬度應該從文件讀取時重要。希望有任何見解。

+0

可能有一些環境變量決定了終端寬度,因此您打開的進程可能會嘗試根據這些進程格式化它的輸出。也許在使用'Popen'時嘗試使用'stdout ='和'stdin ='參數? –

+0

您可以發佈預期的輸出和實際正在打印的內容嗎? –

+0

我在Popen中使用stdout和stdin參數。發佈預期的輸出。 – covfefe

回答

1

當您使用print時,您的屏幕寬度用於打印您的內容,如果稍後調整大小,打印已經完成了計算。

+0

我在閱讀字典中的分割線。所以我期望的是字典的關鍵字包含整個創建查詢以及包含結果的值。但是,發生的事情是查詢被截斷,就像{「CREATE EXTERNAL TABLE tableforview(name string,dob string)STORED AS PARQUE」:「T LOCATION'location';」}。根據終端屏幕的寬度,截止發生的位置也會發生變化。請參閱上面的編輯。 – covfefe

+0

我不認爲這就是印刷品的作品。 Print只是將你輸入的內容輸出到指定的流(默認情況下爲「sys.stdout」),然後終端決定將輸出行分割成哪些部分(即在哪裏輸出'\ n')。當您調整終端的大小時,它會重新計算一遍。打印本身並不知道終端寬度。您可以指定任何其他流,它的行爲完全相同。 –

+0

@BłażejMichalik它取決於終端,有些不會重新計算您的文本。但我說的方式就像印刷品對它負責,我的不好 –