java执行python提示import os找不到_java调用python的痛苦历史(无法获取环境变量)...

环境: java,was,python2.6,Red Hat linux,oracle,cx_Oracle for python

问题是这样,需要处理. 简而言之,将数据取出,使用python传递外部参数进行处理,然后再写回. 如果直接使用Java,则需要大个圈,这比较麻烦. 如果使用python,则非常简单. 因此,有以下故事. 希望与我有同样问题的学生能为您提供帮助. 在某些方面,java和python的功能开发非常顺利,因此调用python链接为java

可能为需要使用的功能编写了两个脚本,一个用于连接,一个用于实现功能,这对于以后的描述很方便

dbconn.py用于连接

#!/usr/bin/python#coding: UTF-8

importcx_Oracledefora_conn():

user_name= 'user'passwd= 'pass'host= 'localhost/orcl'conn=cx_Oracle()return conn

case.py用于处理数据

'''接收传入参数

使用传入参数作为where条件到oracle中进行查找

对数据进行处理

写回到oracle'''

#!/usr/bin/python#coding: UTF-8

importosimportsys#尝试获取环境变量my_home

my_home = os.getenv('my_home')if notmy_home:

my_home= '/home/user_name'

#cx_Oracle脚本是放在pypk目录里的,因此需要增加这个地方

sys.path.append('%s/pypk' %my_home)importdbconn#接收参数,为了防止后面因为手误将此变量变更这里用global声明下全局,可有可无

globalout_into

out_into= sys.argv[1]#获取数据

defget_data():print 'get data'conn=dbconn.ora_conn()

conn_cur=conn.cursor()

sql= 'select col1,col2 from tablename where col1 = %r' %out_into

data_values=conn_cur.execute(sql)

result=list(data_values)

conn_cur.close()

conn.close()returnresult#处理,为了方便,假设就是在col1前面加a和col2前面加b,然后拼在一起用;分隔

defmanage_data(values):print 'manage data'col1= 'a' +str(values[0])

col2= 'b' + str(values[1])

col_return= col1 + ';' +col2returncol_return#写入d

definto_data(into_values):print 'insert into data'conn=dbconn.ora_conn()

conn_cur=conn.cursor()

sql= 'insert into result_table(col) values(%r)' %into_values

conn_cur.execute(sql)

conn.commit()

conn_cur.close()

conn.close()defmain():print 'run start'datas=get_data()for line indatas:

ok_values=manage_data(line)

into_data(ok_values)if __name__ == '__main__':

main()

exit()

由于我不知道Java调用的效果,因此我首先编写了一个简单的python脚本,并通过Java调用对其进行了测试

test.py这仅用于测试功能,因此只有一行代码

print 'hello'

测试成功. 因为这里没有环境,所以我不会截屏. 添加了两行以测试通过参数

test.py

print 'hello'a= sys.argv[1]print a

同样成功,我完全放心地去了官方脚本进行测试java 调用失败重试2次,并正常打印了脚本的内容

运行开始

获取数据

管理数据

插入数据

转到,发现目标表result_table没有数据. 我擦了一下,该死,没有报告错误,也没有处理它,完全毫无头绪,请尝试添加尝试以查看是否有帮助. 所以case.py的主要功能变成这样

defmain():print 'run start'

try:

datas=get_data()for line indatas:

ok_values=manage_data(line)

into_data(ok_values)exceptException, e:print e

这一次证明cx_Oracle连接失败,缺少libclntsh.so.11.1. 在这里,我们强调了所有调用win的cx_Oracle,需要复制什么dll,在linux中这是没有用的,甚至Win也不是将一堆dll复制到脚本的当前目录中,如上所述. 只是治愈症状的方法.

正确的方法是添加三个环境变量

export ORACLE_HOME=oracle_install_path #第一个当然是ORACLE_HOME

export PATH=$PATH:$ORACLE_HOME/bin #第二个是bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib #第三个是lib

我不想离开维修站. 我建议将这三个变量添加到〜/ .bashrc中,但这不能解决基本问题,如稍后将解释的,请继续往下看

添加环境变量后,再次执行. 错误连接到Oracle,Nima狗添加了该错误,因此在本地linux服务器上执行了该错误,并生成了结果. . . . . . 正常执行是完全有问题的. 这次真是地狱. 楠(Nan)说的很好,只有一个道理java 调用失败重试2次,所以我不相信. 我想看看有什么问题. 根据过去的经验,如果添加环境变量失败,则该用户和添加该环境变量的用户可能会不一致. 在case.py

中添加一个段落

importgetpass

now_user= getpass.getuser() #用来获取当前操作用户

print now_user

结果是root,是的,它是root,我也是SB. .bashrc是不是全局变量,还是所有用户都可以使用的环境变量?忘记了,死马是活马医,让我们看看环境变量中有什么东西,在case.py中添加另一行

os.system('env') #调用linux的外部命令,查看全部环境变量

然后出乎意料地出现了,根本没有将三个环境变量添加到打印的环境变量中,并且其中大多数不是Linux中的环境变量. 其中许多被was使用. 它有自己的环境吗?变量,我问同事. 果然,我确实有自己的环境变量配置. 既然已经发现问题,解决方案是将这三个添加到自己的环境变量中. 因此,. . . . . was中添加了三个环境变量ORACLE_HOME,PATH,LD_LIBRARY_PATH.

在重新测试下,尼玛刚刚加入的内容不在其中,这很尴尬,该怎么办. . . 怎么做. . . 最后,当分针从12缠绕到11时,有一种方法可以将环境变量添加为外部命令. 只需继续在case.py

中添加三行

os.system(export ORACLE_HOME=oracle_install_path)

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

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

这一次,我几乎要成为福尔摩斯了,我觉得我已经超过了一些楠,还有木头,但是事实仍然给了我打击,失败了,这三个印刷环境变量仍然不存在,原因是这样的: 添加的环境变量将不会直接有效,需要注销才能生效,它只是折叠起来,然后分针从12变为11. 突然受到启发,如果您可以使用Python自己的添加环境变量的方法,可以绕过取消注销的步骤,只需完成注销,因此将case.py放入

os.system(export ORACLE_HOME=oracle_install_path)

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

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

替换以下内容

oracle_home_env = [['ORACLE_HOME','oracle_install_path'],['PATH','$PATH:$ORACLE_HOME/bin'],['LD_LIBRARY_PATH','$LD_LIBRARY_PATH:$ORACLE_HOME/lib']]for env_line inoracle_home_env:

os.environ[env_line[0]]= env_line[1]

好的,我承认,这种方法不是我想出的. 可以想到这种添加环境变量的方法的人真的是上帝

继续我们的故事,然后出现奇迹,这三个环境变量最终出现在打印结果中,但是仍然报告连接的错误,但这很容易处理,因为环境变量指向,然后只需使用linux方法来调用脚本. 只需使其简单并添加一个新脚本即可调用case.py,只需几行

call_script.py用于使用外部命令调用case.py

#!/usr/bin/python#coding: UTF-8

importos

out_into= sys.argv[1]

my_home= os.getenv('my_home')if notmy_home:

my_home= '/home/user_name'os.system('python %s/case.py %s' %(my_home,out_into))

故事就在这里,但是像大多数剧本一样,一定总有个鸡蛋哈哈

您认为这是结局吗?当然没有,您见过my_home了,这也是一个环境变量!这里没有错误的原因是因为在下面添加了if. 如果未获得,默认为/ home / user_name,但是路径更改了吗?通过此升级,我觉得这些棍棒可以升级为金箍棒. 这是一件小事吗?好吧,我们不要说话,我要吃点东西来庆祝.

这是春节,已经一年了,直到今天,我仍然可以看到这篇文章也是命运. 在这里,我祝大家在新的一年里有很多钱,更少的矿坑,身体健康,身体健康. 可以实现标志!

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-175741-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值