在使用subprocess.call之后如何打印变量?

时间:2018-11-24 18:16:12

标签: python subprocess

在我的程序中,我使用subprocess.call自动运行apache drill。 在那之后,我进行了一些查询,我想打印结果。 在对代码进行编程以自动运行apache drill之前,我是手动进行的,我可以打印结果,但是现在我做不到。 我最后的尝试是写一个文件,但是行为是相同的,什么也没写。 我的代码在下面。

import subprocess
from pydrill.client import PyDrill
import sys
writer = open('resultado.txt', 'w')
cmdmsg = subprocess.check_output("cd C:\\Users\\Tito\\Downloads\\apache-drill-1.14.0\\bin & sqlline -u \"jdbc:drill:zk=local\"", shell = True)
writer.write("teste de msg: " + str(cmdmsg))
drill = PyDrill(host='localhost', port=8047)
if drill.is_active:
    result = drill.query('''SELECT * FROM cp.`employee.json` LIMIT 3''')
    result2 = drill.query('''SELECT * FROM dfs.`/Users/Tito/Desktop/banco_gal.csv` LIMIT 5''')
    for tuple in result2:
        writer.write(tuple)
writer.close

1 个答案:

答案 0 :(得分:0)

我可以解决这个问题。 这件事有3件事很重要。 a)我们应该在打开该Apache钻探后杀死Java虚拟机和Shell。 b)Windows缓冲区很短,因此尚未打印结果。 c)popen方法比调用此任务更好。

import os
import re
import subprocess
import traceback
from os import path
from pydrill.client import PyDrill

DRILL_HOST = 'localhost'
DRILL_PORT = 8047

JAVA_HOME = ''
JAVA_HOME = JAVA_HOME or ("JAVA_HOME" in os.environ and os.environ["JAVA_HOME"])


JPS_EXE_PATH = path.join(JAVA_HOME, 'bin', 'jps.exe')

KILL_DRILL_JVM = True

def getJvmPID(className):
    pid = None
    print('Running JPS cmd: %s' % JPS_EXE_PATH)
    jpsOutput = subprocess.check_output(JPS_EXE_PATH)
    jpsOutput = str(jpsOutput)
    se = re.search(r'([0-9]*\s*)' + className, jpsOutput)
    if se:
        pid = se.group(1)
    return pid

def killProcessByPID(pid):
    killCmd = ['taskkill', '/f', '/pid', str(pid)]
    print('Running taskkill cmd: %s' % killCmd)
    killCmdOuput = subprocess.check_output(killCmd, stderr=subprocess.STDOUT)
    print(str(killCmdOuput))

def killJvm(className):
    pid = getJvmPID(className)
    killProcessByPID(pid)


drillBinDir    = 'C:/Users/Tito/Downloads/apache-drill-1.14.0/bin'

sqlinePath   = path.join(drillBinDir, 'sqlline.bat')

drillCmdList = [sqlinePath , '-u', '"jdbc:drill:zk=local"']
drillCmdStr = " ".join(drillCmdList)
drillConAttempts = 2
while drillConAttempts > 0:
        drillConAttempts -= 1
        print("Connecting to drill on %s:%d..." % (DRILL_HOST, DRILL_PORT))
        try:
            drill = PyDrill(host=DRILL_HOST, port=DRILL_PORT)
        except:
            print("Exception when creating object")
            traceback.print_exc()

        print("Checking Drill conection...")
        try:
            if drill.is_active():
                print("Connected.")
                break
            elif drillConAttempts > 0:
                print("Could not connect to Drill. Trying to start Drill...")
                print("Running cmd '%s > %s'" % (drillCmdStr, os.devnull) )
                devNull = open(os.devnull,"w")
                cmdProc = subprocess.Popen(drillCmdStr, cwd=drillBinDir, stdout=devNull, stderr=subprocess.STDOUT, shell=True)
                print("Started CMD process with PID %d" %(cmdProc.pid))
        except:
            print("Exception when checking connection")
            traceback.print_exc()



if drill.is_active():
    result = drill.query('''SELECT * FROM cp.`employee.json` LIMIT 3''')
    for resultTuple in result:
        print(resultTuple)

if KILL_DRILL_JVM:
    print('Killing Drill process...')
    killJvm('SqlLine')