как печатать переменные после использования subprocess.call? - PullRequest
0 голосов
/ 24 ноября 2018

В моей программе я использую 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 голосов
/ 02 декабря 2018

Я мог бы решить эту проблему.3 вещи важны для этой темы.а) мы должны убить виртуальную машину java и оболочку после того, как эта Apache-тренировка включена.б) буфер Windows очень короткий, поэтому результат не был напечатан.в) метод 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...