我知道这很傻,但出于某种原因,Jython拒绝找到javax.swing.我正在使用Java 1.6.0_11.这是我的初创脚本:
@echo off
"%JAVA_HOME%\bin\java" -Xmx1024M -classpath ".;c:\Projects\Jython2.5.1\jython.jar" org.python.util.jython
Run Code Online (Sandbox Code Playgroud)
我的输出看起来像:
Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_10
Type "help", "copyright", "credits" or "license" for more information.
>>> import javax.swing
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named swing
>>> import javax
>>> dir(javax)
['__name__']
>>>
Run Code Online (Sandbox Code Playgroud)
Fra*_*cki 13
很可能Jython没有扫描你的包.在启动时,Jython尝试遍历其路径上的jar文件和类文件,并扫描Java包.这是必要的,因为无法通过反射查找Java包.包扫描可故意关闭,或者它想要写缓存的信息出来见你,它可能缺乏写入权限http://wiki.python.org/jython/PackageScanning更多.导入Java类的最佳方法是逐类显式地执行此操作,如下所示:
from javax.swing import JFrame
Run Code Online (Sandbox Code Playgroud)
即使程序包扫描已关闭或无法正常工作,此方法也应始终有效,并且是推荐的方法(尽管可能有点单调乏味).如果您确实想要导入包(或者如果您想"从javax.swing import*"执行,这也取决于包扫描 - 但不鼓励),您需要弄清楚包扫描无法正常工作的原因.
Mik*_*g36 11
我有类似的问题,事实证明,由于独立的Jython dist不支持缓存,它也不支持"import*"方法.官方Jython文档中的任何地方都没有明确记录,但我根据一些不同的错误报告得出结论:
值得注意的是最后一个链接:
正如Oti所说,在独立中你必须完全导入才能成功.
要解决您的问题,请使用通过使用"标准"选项安装jython生成的非独立标准jython.jar.
如果你想用你的应用程序打包和分发jython.jar,以防用户没有安装Jython,那么你还需要将整个"Lib"文件夹从jython安装目录复制/填充到你最终的任何位置放置jython.jar.这样可以访问标准jar文件中未包含的python stdlib.
更新:玩了更多,我想我有一个修复程序,即使使用独立jar,也可以启用"import*"类型导入.所有需要做的就是启用缓存!
您可以通过在运行jython时将以下选项添加到jvm来执行此操作:
-Dpython.cachedir.skip = false -Dpython.cachedir = DESIRED CACHE PATH
(注意第二个参数是可选的,如果留空,将使用默认值)
如果您在运行嵌入在应用程序中的InteractiveConsole时出现问题(这就是我的问题),您可以在初始化控制台之前添加这些属性:
Properties props = new Properties();
props.put("python.cachedir.skip", "false");
props.put("python.cachedir", "DESIRED CACHE PATH"); // again, this option is optional
InteractiveConsole.initialize(System.getProperties(), props, new String[0]);
Run Code Online (Sandbox Code Playgroud)