Python-Hive命令使用Subprocess-empty结果
我使用subprocess在python中运行配置单元命令,但得到的结果是空的。如果我从配置单元CLI运行相同的命令,我会得到结果Python-Hive命令使用Subprocess-empty结果,python,hive,subprocess,Python,Hive,Subprocess,我使用subprocess在python中运行配置单元命令,但得到的结果是空的。如果我从配置单元CLI运行相同的命令,我会得到结果 query = "set hive.cli.print.header=true;use mydb;describe table1;" process = subprocess.Popen( ["ssh", "hadoop" , "hive", "-e", "%r" % query], stdout = subprocess.PIPE, stderr = su
query = "set hive.cli.print.header=true;use mydb;describe table1;"
process = subprocess.Popen( ["ssh", "hadoop" , "hive", "-e", "%r" % query], stdout = subprocess.PIPE, stderr = subprocess.PIPE )
data = [line.split('\t') for line in process.stdout]
cols = list(itertools.chain.from_iterable(data[:1]))
df = pd.DataFrame(data[1:], columns = cols)
print "==>"+df+"<----"
query=“set hive.cli.print.header=true;使用mydb;描述表1;”
process=subprocess.Popen([“ssh”、“hadoop”、“hive”、“-e”、“%r”%query],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
数据=[line.split('\t'),用于process.stdout中的行]
cols=list(itertools.chain.from_iterable(数据[:1]))
df=pd.DataFrame(数据[1:],列=cols)
打印“==>”+df+”
myfile是tsv文件,您可以使用pandas.read_csv(sep='\t')并设置sep='\t'
,您可能需要查找pandas api以了解有关read_csv()的更多用法
您应该在17.1.2中查找关于Popen对象的子流程api。它提供了关于stdout=PIPE的警告。
您是否尝试使用wait
函数来等待子流程的完成?请记住,子流程是并行运行的。请详细说明。谢谢。创建流程后,process.wait()
以等待流程完成,然后从标准输出读取数据。否则,在读取标准输出时,流程可能尚未完成。无关:1-您应该使用query
而不是%r”%query
。后者(除其他外)添加引号(没有shell可以删除它们——命令行已经在单独的项上拆分)2-似乎可以使用cols=data和data[0]
而不是cols=list(itertools.chain.from_iterable(data[:1]))
3-除非从管道中读取(同时读取stdout
),否则不要使用stderr=PIPE
)--否则可能会发生死锁。4-在末尾某处调用rc=process.wait()
,以避免僵尸并检查退出状态。如果使用.communicate()
(它可以正确处理stdout
和stderr
),则警告不适用。
myfile=open("query_result.tsv", 'w')
p=subprocess.Popen("your query",
shell=True,
stdout=myfile,stderr=subprocess.PIPE)
stdout,stderr = p.communicate()
if p.returncode != 0:
print stderr
sys.exit(1)