所述greenlet包由GEVENT和eventlet异步IO使用.它被编写为C-extension,因此不适用于Jython或IronPython.如果性能无关紧要,那么在纯Python中实现greenlet API的最简单方法是什么.
一个简单的例子:
def test1():
print 12
gr2.switch()
print 34
def test2():
print 56
gr1.switch()
print 78
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
Run Code Online (Sandbox Code Playgroud)
应该打印12,56,34(而不是78).
我确信它没有,但在Interwebs上寻找一个明确的答案让我有疑问.例如,我有一篇2008年的帖子,乍看之下看起来像个笑话,但看起来似乎很认真.
编辑: ...和被证明是寻找更接近后一个笑话.对困惑感到抱歉.实际上,该帖子的评论回答了我的问题,正如Nikhil正确指出的那样.
我们意识到CPython在这方面远远领先于我们,而且我们缺乏兼容性.在经过严肃的头脑风暴(以及几杯葡萄酒)之后,我们决定在Jython中引入Global Interpreter Lock将解决整个问题!
现在,这里的状态是什么?sourceforge上的"差异"页面根本没有提到GIL.有没有我忽略的官方消息来源?
另请注意,我知道正在进行的讨论GIL是否重要,但我暂时并不关心.
java -jar jython_installer-2.5.2.jar
jython2.5.2主目录中指定的文件夹中jython时,我都会看到一条消息,说明没有安装Jython.我该如何解决这个问题?
我可以使用安装Jython sudo apt-get install jython,但Ubuntu存储库中的Jython是2.2.1,我想要新版本..
尝试同时针对其中两个环境我可以安全地说,如果你必须使用数据库等,你最终必须为该环境编写唯一的代码.你有办法处理这种情况吗?
如何在运行时将JDBC驱动程序添加到Jython?使用CLASSPATH工作,但使用sys.path不能与zxJDBC一起使用,即使该类导入正常并且可以从Jython解释器提示符进行操作.
为什么这样做:
$ CLASSPATH=/tmp/jtds\-1.2.5.jar ./jython
*sys-package-mgr*: processing new jar, '/private/tmp/jtds-1.2.5.jar'
Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_20
Type "help", "copyright", "credits" or "license" for more information.
>>> from java.lang import Class
>>> Class.forName('net.sourceforge.jtds.jdbc.Driver')
<type 'net.sourceforge.jtds.jdbc.Driver'>
Run Code Online (Sandbox Code Playgroud)
但这不是吗?
$ ./jython
Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54)
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_20
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.extend(['/tmp/jtds-1.2.5.jar'])
>>> from java.lang …Run Code Online (Sandbox Code Playgroud) 我认为既然它们都运行在JVM上,Scala和Jython可以一起使用.他们的接口有多好?你能从Jython调用Scala库吗?那些来自Scala的Jython库呢?
我正在尝试使用Jython来实现Hadoop 1.2.1中的实现.除了陈旧的项目(比如code.google.com/p/happy)之外,我已经看到了很少关于Jython + Hadoop的事情,以及一个过时的实现$HADOOP_HOME/src/examples/python/WordCount.py,所以也许我正在吵着错误的树开始......但是这个似乎合情合理.我也非常了解Hadoop Streaming,我可以在不使用Jython的情况下在Hadoop中使用Python,但这不是我在这里要做的.
基本上,当我使用调用嵌入式/独立Jython的jar文件java -jar /full/path/to/myjythonjar.jar中,/full/path/to/myjythonjar.jar/Lib在我的Python sys.path,但是当我调用使用bin/hadoop jar /full/path/to/myjythonjar.jar input output的...jar/Lib是不是在我的道路,并且脚本无法找到Python模块,我引用.
这就是我正在做的......
我正在使用Jython jar的独立版本,并使用该JarRunner界面,大致如此处和其他地方所描述的那样; 基本如下:
cp jython-standalone-2.7-b1.jar jythonsalib_test.jar
jar ufe jythonsalib_test.jar org.python.util.JarRunner __run__.py
Run Code Online (Sandbox Code Playgroud)
也就是说,拿一个独立jar的副本,添加我的脚本名称__run__.py,然后更改Manifest来执行JarRunner- 非常感谢@Frank Wierzbicki为那个gem.
当我直接跑步时,这一切都很好,例如,
java -jar jythonsalib_test.jar
Run Code Online (Sandbox Code Playgroud)
我的sys.path报告包括'/full/path/to/jar/file/jythonsalib_test.jar/Lib',这正是我所期望的,它是我从中获取Python模块的路径(通过设置sys.path为空列表(失败)和仅通过路径(工作)进行经验测试).
当我在Hadoop中运行这个相同的jar时,例如,as
bin/hadoop jar /full/path/to/jar/file/jythonsalib_test.jar input output
Run Code Online (Sandbox Code Playgroud)
sys.path 只包括
['__classpath__', '__pyclasspath__']
Run Code Online (Sandbox Code Playgroud)
我还使用了Jython独立jar版本2.5.4-rc1(它具有上述相同的行为)和2.5.3(由于无关原因,这对我不起作用).
正如其他SO答案所指出的,我目前使用的解决方法基本上是直接添加我的jar的Lib目录,在Jython脚本里面
import sys
sys.path.append('/full/path/to/jar/file/jythonsalib_test.jar/Lib')
Run Code Online (Sandbox Code Playgroud)
这基本上有效 - 但这应该是一个分布式应用程序!我没有可以用这种方式引用的路径.其他SO文章提出了各种机制,但基本上都添加到库路径(再次,没有链接因为我有<10rep),如上面的Python,Java或Jython安装或Jython"注册表"(startup/rc)文件.当然,我可以使用HDFS或引导机制或其他机制将某些东西分发给计算节点,比如jar或Jython或其他什么,但代码已经在jar中了! 所以我不应该再单独分发它......
总而言之:看起来我需要在一个文件系统上,该文件系统可以直接并单独 …
我有以下代码:
public static String getVersion()
{
PythonInterpreter interpreter = new PythonInterpreter();
try
{
interpreter.exec(IOUtils.toString(new FileReader("./Application Documents/Scripts/Version.py")));
PyObject get_version = interpreter.get("get_latest_version");
PyObject result = get_version.__call__(interpreter.get("url"));
String latestVersion = (String) result.__tojava__(String.class);
interpreter.close();
return latestVersion;
} catch (IOException ex) {
ex.printStackTrace();
interpreter.close();
return Version.getLatestVersionOnSystem();
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我添加了Python代码:
import urllib2 as urllib
import warnings
url = 'arcticlights.ca/api/paint&requests?=version'
def get_latest_version(link=url):
request = urllib.Request(link)
handler = urllib.urllopen(request)
if handler.code is not 200:
warnings.warn('Invalid Status Code', RuntimeWarning)
return handler.read()
version = get_latest_version()
Run Code Online (Sandbox Code Playgroud)
它完美无缺,但只有10%的时间.如果我用以下主要运行它:
public static void main(String[] args) …Run Code Online (Sandbox Code Playgroud) 我在python中编写一个与ldap服务器通信的包.我希望它能在CPython和Jython中运行.为了使它与CPython一起使用,我已成功编写了针对python-ldap的代码.但是,要使它与Jython一起使用,我必须使用java jar.
我如何使用我的包分发jar文件,这样如果它可以"导入java",它就知道它的jython,并动态地将java jar添加到路径中并使用它.但是,如果失败,它会知道它的CPython并使用python-ldap库.
有任何想法吗?