Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Hive命令使用Subprocess-empty结果_Python_Hive_Subprocess - Fatal编程技术网

Python-Hive命令使用Subprocess-empty结果

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

我使用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 = 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)