代码之家  ›  专栏  ›  技术社区  ›  MikeHoss

为什么Jython拒绝找到我的Java包?

  •  12
  • MikeHoss  · 技术社区  · 15 年前

    我知道这很愚蠢,但出于某种原因,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 
    

    我的输出如下所示:

    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__']
    >>>
    
    3 回复  |  直到 15 年前
        1
  •  13
  •   Frank Wierzbicki    15 年前

    http://wiki.python.org/jython/PackageScanning 更多。导入Java类的最佳方法是按类显式导入,如下所示:

    from javax.swing import JFrame
    

    即使包扫描已关闭或无法工作,此方法也应始终有效,并且是推荐的方法(尽管可能有点乏味)。如果您确实想导入包(或者如果您想执行“from javax.swing import*”,这也取决于包扫描,但不鼓励这样做),那么您需要找出包扫描不起作用的原因。

        2
  •  11
  •   Mikeyg36    12 年前

    因为独立Jython dist不支持缓存,所以它也不支持“import*”方法。

    最后一个链接值得注意:

    如果您想将jython.jar与应用程序打包并分发,如果用户没有安装jython,那么您还需要将完整的“Lib”文件夹从jython安装目录复制/复制到最终放置jython.jar的位置。这允许访问标准jar文件中未包含的python stdlib。

    更新 :

    您可以通过在运行jython时向jvm添加以下选项来实现这一点:

    假的 -Dpython.cachedir=所需的缓存路径

    (请注意,第二个参数是可选的,如果留空,将使用默认值)

    如果您在运行嵌入在应用程序中的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]);
    
        3
  •  1
  •   Jonathan Feinberg    15 年前

    上的[Java HotSpot(TM)客户端虚拟机(Sun Microsystems Inc.)]

    如果从Jython分发目录中删除cachedir并重试,会发生什么情况?

    另外,为什么要显式地设置类路径?为什么不简单

    java -jar jython.jar
    

    ?