简体   繁体   English

在python subprocess.call()中使用sqlldr失败,但是没有信息

[英]Using sqlldr in python subprocess.call() fails, but no information

I'm in need of some assistance. 我需要一些帮助。 I'm attempting to perform SQLLDR from within python. 我正在尝试从python内部执行SQLLDR。 The best method I found was to use subprocess.call. 我发现最好的方法是使用subprocess.call。 Using the params for another function, I duplicated it within this code. 在其他函数中使用参数,我在这段代码中复制了它。 When I run it, I get the appropriate fields, as expected. 当我运行它时,我得到了预期的适当字段。 But, the process returns a 1, which is a failure. 但是,该过程返回1,这是一个失败。 I have no additional information and can't locate what could be the problem. 我没有其他信息,无法找到可能的问题。

I have verified the data.csv loads into my table from BASH, however python doesn't. 我已经验证了data.csv从BASH加载到我的表中,但是python没有。

def load_raw():
    DATA_FILE='data.csv'
    CONTROL_FILE='raw_table.ctl'
    LOG_FILE='logfile.log'
    BAD_FILE='badfile.log'
    DISCARD_FILE='discard.log'
    connect_string = os.environ['CONNECT_STRING']

    sqlldr_parms='rows=1000 readsize=50000 direct=true columnarrayrows=100 bindsize=500000 streamsize=500000 silent=(HEADER,FEEDBACK)'

    parms = {}
    parms['userid'] = connect_string
    parms['sqlldr'] = sqlldr_parms
    parms['data'] = DATA_FILE
    parms['control'] = CONTROL_FILE
    parms['log'] = LOG_FILE
    parms['bad'] = BAD_FILE
    parms['discard'] = DISCARD_FILE

    cmd = "userid=%(userid)s %(sqlldr)s data=%(data)s control=%(control)s log=%(log)s bad=%(bad)s discard=%(discard)s" % parms

    print "cmd is: %s" % cmd

    with open('/opt/app/workload/bfapi/bin/stdout.txt', 'wb') as out:
      process = call(cmd, shell=True, stdout=out, stderr=out)

    print process

cmd is: sqlldr userid=usr/pass rows=1000 readsize=50000 direct=true columnarrayrows=100 bindsize=500000 streamsize=500000 silent=(HEADER,FEEDBACK) data=data.csv control=raw_table.ctl log=logfile.log bad=badfile.log discard=discard.log cmd是:sqlldr用户ID = usr / pass行= 1000 readsize = 50000直接= true columnarrayrows = 100 bindsize = 500000 streamsize = 500000静默=(HEADER,FEEDBACK)data = data.csv控制= raw_table.ctl log = logfile.log错误= badfile.log丢弃= discard.log

process returns 1 The log files for log, bad and discard are not created 进程返回1未创建用于日志,坏和丢弃的日志文件

stdout.txt contains /bin/sh: -c: line 0: syntax error near unexpected token (' /bin/sh: -c: line 0: sqlldr userid=usr/pass rows=1000 readsize=50000 direct=true columnarrayrows=100 bindsize=500000 streamsize=500000 silent=(HEADER,FEEDBACK) data=data.csv control=raw_table.ctl log=logfile.log bad=badfile.log discard=discard.log' stdout.txt包含/ bin / sh:-c:第0行:意外令牌附近的语法错误(' /bin/sh: -c: line 0: sqlldr userid = usr / pass行= 1000 readsize = 50000直接= true columnarrayrows = 100 bindsize = 500000 streamsize = 500000silent =(HEADER,FEEDBACK)data = data.csv control = raw_table.ctl log = logfile.log bad = badfile.log丢弃= discard.log'

data.csv contains data.csv包含

id~name~createdby~createddate~modifiedby~modifieddate
6~mark~margaret~"19-OCT-16 01.03.23.966000 PM"~kyle~"21-OCT-16 03.11.22.256000 PM"
8~jill~margaret~"27-AUG-16 12.10.12.214000 PM"~kyle~"21-OCT-16 04.16.01.171000 PM"

raw_table.ctl raw_table.ctl

OPTIONS ( SKIP=1)
LOAD DATA
CHARACTERSET UTF8
INTO TABLE RAW_TABLE
FIELDS TERMINATED BY '~' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(ID,
NAME,
CREATED_BY,
CREATED_DATETIME TIMESTAMP,
MODIFIED_BY,
MODIFIED_DATETIME TIMESTAMP)

The error was caused by the silent param. 该错误是由静默参数引起的。 Wrapping it in single quotes allowed the code to work, as here: silent='(HEADER,FEEDBACK)' 用单引号将其包装可以使代码正常工作,如下所示:silent ='(HEADER,FEEDBACK)'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM