在从命令行调用的 Jython 脚本中使用 UCanAccess

Posted

技术标签:

【中文标题】在从命令行调用的 Jython 脚本中使用 UCanAccess【英文标题】:Using UCanAccess in a Jython script invoked from the command line 【发布时间】:2015-10-30 14:29:27 【问题描述】:

操作系统:Windows7、Jython2.7.0FR(“最终版本”)

尝试将 Gord Thompson 的解决方案与 Jython 一起使用:Manipulating an Access database from Java without ODBC

我可以让 Ucanaccess 模块在 Eclipse 中工作,但当我尝试从 CLI 运行时却不行。

# -*- coding: utf-8 -*-
import java, sys
jars_dir = 'D:\\sysadmin\\Resources\\Java jar files\\'
sys.path.append( jars_dir + 'commons-lang-2.6.jar' )
sys.path.append( jars_dir + 'commons-logging-1.2.jar' )
sys.path.append( jars_dir + 'hsqldb.jar' )
sys.path.append( jars_dir + 'jackcess-2.1.2.jar' )
sys.path.append( jars_dir + 'ucanaccess-3.0.2.jar' )
import net.ucanaccess.jdbc.UcanaccessDriver
import net.ucanaccess
print( '# appear to have imported UcanaccessDriver' )
conn = java.sql.DriverManager.getConnection( 'jdbc:ucanaccess://D:/TESTING.mdb' )
print( '# conn OK...') 

当我在 Eclipse 中运行它时,它会打印出“# conn OK”。 当我从 CLI 运行它时,它会打印出“# 似乎已导入...”,但随后会引发错误:

(注意这个输出复制到 Eclipse:它确实是 CLI 运行)

有人知道为什么我会收到“没有合适的驱动程序...”吗?请注意,我在 getConnection 中尝试了使用反斜杠而不是正斜杠的各种排列...无济于事。

顺便说一句,如果这是相关的,这是我用来运行这个东西的 .bat 文件的摘录:

cd "%SOFTWARE_PROJECTS%\workspace\Jython scratchpad\src\jython_scratchpad_root"

REM this is probably irrelevant and doesn't seem to work with Jython2.7.0FR.  The jars are being loaded by sys.path.append, obviously
set CLASSPATH=.;"%SYSADMIN%\resources\java jar files/*"

D:\apps\jython2.7.0\bin\jython loading_test.py 

【问题讨论】:

jdbc url 是正确的,后面的java 版本是什么? 谢谢。如果我不完全清楚如何回答您的问题,请原谅我:OS JAVA_HOME Env Var 指向 jdk1.7.0_79。 Windows PATH Env Var 包括 jdk1.7.0_79\jre\bin,至于 Eclipse,我有点难过它在运行 Jython 项目时如何寻找它的 JRE,但是在 Preferences --> Java --> Installed 下JREs,它再次指向 jdk1.7.0_79。你是在暗示我实际上有义务迁移到 Java 8??? 在您的批处理文件中,尝试设置 CLASSPATH 以包含各个 JAR 文件。我刚试过this,它对我有用。 @GordThompson 谢谢。我已经尝试过这个和许多其他排列,但实际上我今天发布了另一个关于在 Jython 2.7.0FR(“最终版本”)中加载 jar 的问题:***.com/questions/33434083/…。我注意到在您的 sn-p 中您使用的是 Jython 2.5.3。您是否尝试过将 Ucanaccess 与 2.7.0FR 一起使用? PS 在使用“动态加载”(sys.path.append...) 后我得到“#似乎已导入...”这一事实似乎表明我已经加载了这些 jars。 不,我只是想知道是不是java6。但事实并非如此。 【参考方案1】:

似乎sys.pathPATH 环境变量的关系比CLASSPATH 环境变量更多。以下两种方法已经过测试,并且可以与 Jython 2.7.0 一起从 Windows 命令行运行名为“jyTest.py”的脚本

方法 1:在启动 Jython 之前从批处理文件(或 shell 脚本)设置 CLASSPATH

SET CLASSPATH=C:/Users/Public/Downloads/UCanAccess/ucanaccess-3.0.2.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-lang-2.6.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-logging-1.1.1.jar;C:/Users/Public/Downloads/UCanAccess/lib/hsqldb.jar;C:/Users/Public/Downloads/UCanAccess/lib/jackcess-2.1.2.jar;.  
c:\jython2.7.0\bin\jython jyTest.py

(对于 Linux 等人,这将是 export CLASSPATH ...,以及冒号分隔符而不是分号。)

方法二:调用Jython时使用-J-cp设置CLASSPATH

c:\jython2.7.0\bin\jython -J-cp C:/Users/Public/Downloads/UCanAccess/ucanaccess-3.0.2.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-lang-2.6.jar;C:/Users/Public/Downloads/UCanAccess/lib/commons-logging-1.1.1.jar;C:/Users/Public/Downloads/UCanAccess/lib/hsqldb.jar;C:/Users/Public/Downloads/UCanAccess/lib/jackcess-2.1.2.jar;. jyTest.py

(同样,Linux 和朋友需要将 -cp 条目用冒号而不是分号分隔。)

【讨论】:

谢谢...发现了问题:我没有意识到 ucanaccess jar 在目录中,而其他 4 个 jar 在名为“lib”的子目录中。还发现,部分由于你在这里的回答,我在用 2.7.0FR 加载罐子时遇到的一般问题的答案:正斜杠和没有空格的路径......(似乎是相对于 2.7b1 的变化)。跨度>

以上是关于在从命令行调用的 Jython 脚本中使用 UCanAccess的主要内容,如果未能解决你的问题,请参考以下文章

使用 ij 和 loci 类使 ImageJ/Fiji Jython 脚本在 bash 脚本中工作

wsadmin jython 脚本退出代码到调用脚本

用于发送邮件的 php 脚本在通过浏览器执行时不起作用,但在从命令行执行时工作正常

Jython的简单使用

在命令行中使用 WbExport 时缺少数据和 sql 脚本文件

powershell 具有常量块的Powershell函数模板,您可以在从命令行调用和添加任何类型的参数时覆盖它