首页 Python java调用python的惨痛史(无法获取环境变量)

java调用python的惨痛史(无法获取环境变量)

环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle 事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用python使用外部传参做一个处理,再写回到数据库。如果使用java直接搞的话需要绕很大一个圈,比较麻烦,用pytho

环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle 事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用python使用外部传参做一个处理,再写回到数据库。如果使用java直接搞的话需要绕很大一个圈,比较麻烦,用python的话就很简单了,于是就有了下面的故事,希望和我遇到同样问题的同学能对你们有一些帮助,少绕一些圈子,java和python功能开发都很顺利,于是到了java调用python环节

大概把需要用到的功能写两个脚本,一个是用于连接数据库的,一个是用来实现功能的,方便后面说明dbconn.py 这个用来连接数据库

<span style=”color: #0000ff”>import<span style=”color: #000000″> cx_Oracle

<span style=”color: #0000ff”>def<span style=”color: #000000″> ora_conn():
user_name = <span style=”color: #800000″>'<span style=”color: #800000″>user<span style=”color: #800000″>'<span style=”color: #000000″>
passwd = <span style=”color: #800000″>'<span style=”color: #800000″>pass<span style=”color: #800000″>'<span style=”color: #000000″>
host = <span style=”color: #800000″>'<span style=”color: #800000″>localhost/orcl<span style=”color: #800000″>'<span style=”color: #000000″>
conn =<span style=”color: #000000″> cx_Oracle()
<span style=”color: #0000ff”>return conn

case.py 这个用来加工数据

<span style=”color: #0000ff”>import<span style=”color: #000000″> os
<span style=”color: #0000ff”>import<span style=”color: #000000″> sys

<span style=”color: #008000″>#<span style=”color: #008000″>尝试获取环境变量my_home
my_home = os.getenv(<span style=”color: #800000″>'<span style=”color: #800000″>my_home<span style=”color: #800000″>'<span style=”color: #000000″>)
<span style=”color: #0000ff”>if <span style=”color: #0000ff”>not<span style=”color: #000000″> my_home:
my_home = <span style=”color: #800000″>'<span style=”color: #800000″>/home/user_name<span style=”color: #800000″>’

<span style=”color: #008000″>#<span style=”color: #008000″>cx_Oracle脚本是放在pypk目录里的,因此需要增加这个地方
sys.path.append(<span style=”color: #800000″>'<span style=”color: #800000″>%s/pypk<span style=”color: #800000″>’ %<span style=”color: #000000″>my_home)

<span style=”color: #0000ff”>import<span style=”color: #000000″> dbconn

<span style=”color: #008000″>#<span style=”color: #008000″>接收参数,为了防止后面因为手误将此变量变更这里用global声明下全局,可有可无
<span style=”color: #0000ff”>global<span style=”color: #000000″> out_into
out_into = sys.argv[1<span style=”color: #000000″>]

<span style=”color: #008000″>#<span style=”color: #008000″>获取数据库数据
<span style=”color: #0000ff”>def<span style=”color: #000000″> get_data():
<span style=”color: #0000ff”>print <span style=”color: #800000″>'<span style=”color: #800000″>get data<span style=”color: #800000″>'<span style=”color: #000000″>
conn =<span style=”color: #000000″> dbconn.ora_conn()
conn_cur =<span style=”color: #000000″> conn.cursor()
sql = <span style=”color: #800000″>'<span style=”color: #800000″>select col1,col2 from tablename where col1 = %r<span style=”color: #800000″>’ %<span style=”color: #000000″>out_into
data_values =<span style=”color: #000000″> conn_cur.execute(sql)
result =<span style=”color: #000000″> list(data_values)
conn_cur.close()
conn.close()
<span style=”color: #0000ff”>return<span style=”color: #000000″> result

<span style=”color: #008000″>#<span style=”color: #008000″>处理,为了方便,假设就是在col1前面加a和col2前面加b,然后拼在一起用;分隔
<span style=”color: #0000ff”>def<span style=”color: #000000″> manage_data(values):
<span style=”color: #0000ff”>print <span style=”color: #800000″>'<span style=”color: #800000″>manage data<span style=”color: #800000″>'<span style=”color: #000000″>
col1 = <span style=”color: #800000″>'<span style=”color: #800000″>a<span style=”color: #800000″>’ +<span style=”color: #000000″> str(values[0])
col2 = <span style=”color: #800000″>'<span style=”color: #800000″>b<span style=”color: #800000″>’ + str(values[1<span style=”color: #000000″>])
col_return = col1 + <span style=”color: #800000″>'<span style=”color: #800000″>;<span style=”color: #800000″>’ +<span style=”color: #000000″> col2
<span style=”color: #0000ff”>return<span style=”color: #000000″> col_return

<span style=”color: #008000″>#<span style=”color: #008000″>写入数据库d
<span style=”color: #0000ff”>def<span style=”color: #000000″> into_data(into_values):
<span style=”color: #0000ff”>print <span style=”color: #800000″>'<span style=”color: #800000″>insert into data<span style=”color: #800000″>'<span style=”color: #000000″>
conn =<span style=”color: #000000″> dbconn.ora_conn()
conn_cur =<span style=”color: #000000″> conn.cursor()
sql = <span style=”color: #800000″>'<span style=”color: #800000″>insert into result_table(col) values(%r)<span style=”color: #800000″>’ %<span style=”color: #000000″>into_values
conn_cur.execute(sql)
conn.commit()
conn_cur.close()
conn.close()

<span style=”color: #0000ff”>def<span style=”color: #000000″> main():
<span style=”color: #0000ff”>print <span style=”color: #800000″>'<span style=”color: #800000″>run start<span style=”color: #800000″>'<span style=”color: #000000″>
datas =<span style=”color: #000000″> get_data()
<span style=”color: #0000ff”>for line <span style=”color: #0000ff”>in<span style=”color: #000000″> datas:
ok_values =<span style=”color: #000000″> manage_data(line)
into_data(ok_values)

<span style=”color: #0000ff”>if <span style=”color: #800080″>name == <span style=”color: #800000″>'<span style=”color: #800000″>main<span style=”color: #800000″>'<span style=”color: #000000″>:
main()
exit()

因为不知道java调用效果怎样,先写了个简单的python脚本用java调用测试了下

test.py 这个只是用来测试功能,所以只有一行代码

测试成功,这里因为这边没有环境,就不截图了,大家凑合看吧。又加入两行,测试了一下传参

test.py

= sys.argv[1 a

一样成功了,信心满满的上正式脚本来测试,正常打印了脚本中的内容

去数据库里面查,结果目标表result_table没有数据。我擦,这什么鬼,没报错也没有处理,完全没有头绪,尝试加上try看看有没有什么帮助。于是case.py的main函数就变成了下面这样

= line = e

这次果然有结果了,cx_Oracle连接失败,缺少libclntsh.so.11.1,这里着重说明下,网上都是win调用cx_Oracle的,需要拷贝什么dll,这个在linux中是没用的,而且就算是win也不是像上面说的那样把一堆dll拷贝到脚本当前目录里面,这样只是治标不治本。正确的方法是加三个环境变量

export ORACLE_HOME=oracle_install_path
export PATH=:/bin
export LD_LIBRARY_PATH=:/lib

我不想留坑,建议这三个变量加到~/.bashrc里面,不过这个并没有解决根本问题,后面会说明,请各位继续往下看

加入环境变量以后又执行了下,报错connect to Oracle Database,尼玛犬加上了啊,于是在本地linux服务器执行了下,结果。。。。。。正常执行,完全问题,这次真是见鬼了啊。某楠说的好,真相只有一个,特么就不信了,我倒要看看是出什么问题了,根据以往经验,环境变量加失败的话可能是使用用户和加环境变量的用户不一致,于是在case.py里面加上一段

= getpass.getuser()
now_user

结果是root,对啊,是root啊,而且我也是SB了,.bashrc这个不是应该全局的么,就是全部用户通用的环境变量啊。算了,死马当活马医,倒要看看环境变量里都是什么玩意,在case.py里面再加一行

os.system()

然后,意外出现了,打印出来的环境变量里面根本就没有加入的三个环境变量,而且大部分都不是linux里面的环境变量,好多都是was用的,难道是was有自己的环境变量么,问了下同事,果然坑啊,真的有自己的环境变量配置。这下问题找到了,那么解决办法就是把这三个加到was自有的环境变量里面就好了嘛,于是。。。。。。在was里加入了ORACLE_HOME、PATH、LD_LIBRARY_PATH这三个环境变量。 重新测试下,尼玛刚才加入的居然不在里面,这就尴尬了,怎么办。。。怎么办。。。在分针从12绕到11的时候,终于,办法有了,把环境变量作为外部命令加进去不就行了,继续在case.py中加入三行

os.system(export ORACLE_HOME==$PATH:$ORACLE_HOME/=$LD_LIBRARY_PATH:$ORACLE_HOME/lib)

本文来自网络,不代表青岛站长网立场。转载请注明出处: https://www.0532zz.com/html/kaifa/python/20200722/6922.html
上一篇
下一篇

作者: dawei

【声明】:青岛站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

返回顶部