注意:我找到了解决方案并自己回答.虽然,我不知道为什么这个设置错了并导致了问题.我仍然对Jython导入系统如何工作有一个很好的解释感兴趣; 如果有人关心获得赏金,请回答.
我正在开发一个现有的Java EE项目,我需要在Python中进行计算.我正处于集成测试的第一阶段,但我已经面临一个问题.我阅读了Jython书的第10章,但仍无法找到解决方案.我还阅读了第8章(代码重用的模块和包),但对我来说还不清楚.
关于Jython导入系统如何工作以及如何配置它的解释将非常感激.
问题:
$ jython -v
import: 'exceptions' as org.python.core.exceptions in builtin modules
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35) 
[Java HotSpot(TM) Server VM (Oracle Corporation)] on java1.7.0_10
import: import site # precompiled from /home/me/jython/2.5.3/Lib/site$py.class
import: 'sys' as sys in builtin modules
import: import os # precompiled from /home/me/jython/2.5.3/Lib/os$py.class
import: 'errno' as org.python.modules.errno in builtin modules
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules
import: import posixpath # precompiled from /home/me/jython/2.5.3/Lib/posixpath$py.class
import: import …我知道这很傻,但出于某种原因,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__']
>>>
原始情况:
我正在处理的应用程序将在特定文件已添加数据并准备好读取时接收来自另一个应用程序的通知.目前我有这样的事情:
class Foo(object):
    def __init__(self):
        self.myFile = open("data.txt", "r")
        self.myFile.seek(0, 2) #seeks to the end of the file
        self.mainWindow = JFrame("Foo",
                                 defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
                                 size = (640, 480))
        self.btn = JButton("Check the file", actionPerformed=self.CheckFile)
        self.mainWindow.add(self.btn)
        self.mainWindow.visible = True
    def CheckFile(self, event):
        while True:
            line = self.myFile.readline()
            if not line:
                break
            print line
foo = Foo()
最终,当在套接字上收到某个消息时,将触发CheckFile().目前,我正在从JButton触发它.
尽管程序中的任何其他位置都没有触及该文件,并且我没有with在文件上使用该文件,但是ValueError: I/O operation on closed file当我尝试readline()它时,我仍然继续使用该文件.
初步解决方案
在试图弄清楚文件何时被关闭时,我将我的应用程序代码更改为:
foo = Foo()
while True:
    if foo.myFile.closed == True: …我知道Jython将Python代码转换为Java字节代码,但两者之间是否有任何语法变化?并且作为一个附带问题是Jython 3.x可用还是仍然被移植?
我试图在文本文件的末尾附近找到一个字符串.问题是文本文件的大小可能有很大差异.从3MB到4GB.但每次我尝试运行脚本在大约3GB的文本文件中找到此字符串时,我的计算机内存不足.所以我想知道是否有任何方式让python找到文件的大小,然后读取它的最后一兆字节.
我目前使用的代码如下,但正如我之前所说,我似乎没有足够大的内存来读取这么大的文件.
find_str = "ERROR"
file = open(file_directory)                           
last_few_lines? = file.readlines()[-20:]   
error? = False  
for line in ?last_few_lines?:
    if find_str in line:
    ?    error? = True
我们有一些Java代码要用于我们计划用Python编写的新代码,因此我们对使用Jython感兴趣.但是,我们还想使用numpy和pandas库在这个Python代码中进行复杂的统计分析.
是否有可能从Jython中调用numpy和pandas?
我正在寻找运行一些未经验证的脚本(用一种尚未确定的语言编写,但需要基于Java,因此JRuby,Groovy,Jython,BeanShell等都是候选者).我希望这些脚本能够做一些事情并限制做其他事情.
通常,我只是使用Java的SecurityManager并完成它.这非常简单,让我限制文件和网络访问,关闭JVM的能力等等.这对我想要阻止的高级别东西很有效.
但是我想要允许一些东西,但只能通过我提供的自定义API /库.例如,我不想允许直接网络访问打开到yahoo.com的URLConnection,但如果使用MyURLConnection完成,我没关系.那就是 - 我想要允许的一组方法/类,然后我想要的其他一切不受限制.
我不相信这种类型的安全性可以使用标准的Java安全模型来完成,但也许它可以.我对脚本语言本身的性能或灵活性没有特定要求(脚本将通过基本循环/分支对我的API进行简单的过程调用).所以即使是一个"大"的开销来检查每次反射调用的安全检查也没问题.
建议?
很可能是一个愚蠢的问题,因为我对Java/Jython/JRuby /字节码不太了解,但..
今天我偶然发现了_why的邪恶 ......它允许你从Ruby代码输出Python字节码.基本上允许它们生成相同的字节码..
Jython输出Java字节码,就像JRuby一样.由于这些都编译为相同的字节码,这是否意味着您可以使用Ruby中的任何Python库和Python中的Ruby库?
我在jython下导入scapy时遇到了一些问题.我一直在做java,但python只用了一两天.
重现问题的简单案例是:
$jython
>>> import sys
>>> sys.path
['', '/usr/share/jython/Lib', '/usr/lib/site-python', '__classpath__']
>>> from scapy.all import *
Traceback (innermost last):
File "<console>", line 1, in ?
ImportError: no module named scapy
如果我完成这些完全相同的步骤python,一切正常.我怎么告诉jython使用scapy?如果它有帮助,我正在运行ubuntu 10.04并安装了jython和scapy viaapt-get install
最近我在Jython平台上玩Django,并希望在"生产"中看到它的性能.我测试的网站只是一个简单的return HttpResponse("Time %.2f" % time.time())视图,因此不涉及数据库.我尝试了以下两种组合(使用ab -c15 -n500 -k <url>VirtualBox上的Ubuntu Server 10.10中的所有内容完成测量):
J2EE应用服务器(Tomcat/Glassfish),部署了WAR文件
我得到的结果就像
Requests per second:    143.50 [#/sec] (mean)
[...]
Percentage of the requests served within a certain time (ms)
  50%     16
  66%     16
  75%     16
  80%     16
  90%     31
  95%     31
  98%    641
  99%   3219
 100%   3219 (longest request)
显然,服务器偶尔会挂起几秒钟,这是不可接受的.我认为它与重新加载Jython有关,因为启动jythonshell也需要大约3秒钟.
AJP服务使用修补的flup包(+ Apache作为前端)
注意:flup是使用的包manage.py runfcgi,我不得不修补它因为flup的线程/分叉支持似乎不适用于Jython( - > AJP是唯一的工作方法).
这里的结果几乎相同,但有时最后100个请求根本没有得到解答(但服务器进程仍然存在).
我在SO(而不是serverfault)上问这个,因为它特别是Django/Jython. 有没有人有在Jython上部署Django网站的经验?可能有另一种(更快)的方式来为网站服务吗?或者在Java平台上使用Django还为时尚早?