2017-02-14 42 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它取决于终端,有些不会重新计算您的文本。但我说的方式就像印刷品对它负责,我的不好 –