У меня был тот же вопрос, но потом у меня был момент «духа». Вместо записи
x ~ y
напишите
y ~ x
Очевидно, что это соответствует «x» вместо «y», но отвечает «есть ли совпадение?». вопрос и простой обход DOM могут привести вас к правильному элементу более эффективно, чем цикл в javascript.
Я понимаю, что исходный вопрос был вопросом CSS, поэтому этот ответ, вероятно, совершенно не имеет значения, но другие пользователи Javascript могут споткнуться на вопрос через поиск, как я.
Вот мое резюме этой проблемы: 5 способов вызова Java из Python
http://baojie.org/blog/2014/06/16/call-java-from- python / ( cached )
Короткий ответ: Jpype работает очень хорошо и доказан во многих проектах (например, python-pipepipe), но Pyjnius быстрее и проще чем JPype
Я пробовал Pyjnius / Jnius, JCC, javabridge, Jpype и Py4j.
Py4j немного сложнее в использовании, так как вам нужно запустить шлюз, добавив еще один слой хрупкости.
Вы также можете использовать Py4J . На первой странице есть пример и много документации, но по сути, вы просто вызываете Java-методы из вашего кода на Python, как если бы они были методами python:
from py4j.java_gateway import JavaGateway
gateway = JavaGateway() # connect to the JVM
java_object = gateway.jvm.mypackage.MyClass() # invoke constructor
other_object = java_object.doThat()
other_object.doThis(1,'abc')
gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method
В отличие от Jython, одна часть Py4J работает в Python VM, поэтому он всегда «обновляется» с последней версией Python, и вы можете использовать библиотеки, которые не работают на Jython (например, lxml). Другая часть выполняется на виртуальной машине Java, которую вы хотите вызвать.
Связь осуществляется через сокеты вместо JNI, а Py4J имеет свой собственный протокол (для оптимизации определенных случаев, для управления памятью и т. д.).
Отказ: я автор Py4J
В последнее время я много интегрировал в Python, включая Java. Самый надежный метод, который я нашел, - использовать IKVM и оболочку C #.
IKVM имеет небольшое приложение, которое позволяет вам использовать любой Java JAR и преобразовывать его непосредственно в DLL .Net. Он просто переводит байт-код JVM в байт-код CLR. Подробнее см. В http://sourceforge.net/p/ikvm/wiki/Ikvmc/ .
Преобразованная библиотека ведет себя как родная библиотека C #, и вы можете ее использовать без необходимости использования JVM. Затем вы можете создать проект оболочки C # DLL и добавить ссылку на преобразованную DLL.
Теперь вы можете создать несколько заглушек-оболочек, которые вызывают методы, которые вы хотите открыть, и пометить эти методы как DllEport. Подробнее см. В https://stackoverflow.com/a/29854281/1977538 .
DLL-оболочка действует так же, как и родная библиотека C, с экспортированными методами, C. Вы можете подключиться к ним, используя ctype, как обычно.
Я пробовал его с Python 2.7, но он также должен работать с 3.0. Работает на Windows и Linuxes
Если вы используете C #, то, вероятно, это лучший подход, чтобы попытаться интегрировать почти что-нибудь в python.
Я предполагаю, что если вы можете перейти с C ++ на Java, тогда вы все настроены. Я видел продукт такого рода, о котором вы хорошо говорите. Так получилось, что мы использовали CodeMesh . Я не специально одобряю этого поставщика или делаю какие-либо заявления об относительном качестве их продукта, но я видел, что он работает в довольно высоком сценарии.
Я бы сказал, что, если вообще возможно, я бы рекомендуйте избегать прямой интеграции через JNI, если сможете. Некоторый простой подход к сервису REST или архитектура на основе очереди будут проще упрощать и диагностировать. Вы можете получить довольно приличную производительность, если тщательно использовать такие развязанные технологии.
Pyjnius.
Документы: http://pyjnius.readthedocs.org/en/latest/
Github: https: / /github.com/kivy/pyjnius
На странице github:
Модуль Python для доступа к классам Java в качестве классов Python с использованием JNI.
PyJNIus - это «Работа в процессе».
Быстрый обзор
blockquote>>>> from jnius import autoclass >>> autoclass('java.lang.System').out.println('Hello world') Hello world >>> Stack = autoclass('java.util.Stack') >>> stack = Stack() >>> stack.push('hello') >>> stack.push('world') >>> print stack.pop() world >>> print stack.pop() hello
Я только начинаю использовать JPype 0.5.4.2 (июль 2011), и похоже, что он работает хорошо ... Я на Xubuntu 10.04
Я на OSX 10.10.2 и преуспел в использовании JPype.
Устранены проблемы установки с Jnius ( другие тоже ), Javabridge установлен, но дал таинственные ошибки когда я попытался использовать его, PyJ4 испытывает такое неудобство при запуске сервера шлюза в Java сначала, JCC не будет устанавливать. Наконец, JPype закончил работу. В Github есть поддерживаемая форма JPype . Он имеет следующие основные преимущества: (a) он правильно устанавливается и (b) он может очень эффективно преобразовывать массивы java в массив numpy (np_arr = java_arr[:]
)
Процесс установки был:
git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install
И вы должны быть в состоянии import jpype
Следующая демо работала:
import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM()
Когда я попытался вызвать свой собственный Java-код, мне пришлось сначала скомпилировать (javac ./blah/HelloWorldJPype.java
), и мне пришлось изменить путь JVM по умолчанию (в противном случае вы получите необъяснимые ошибки «class not found»). Для меня это означало изменение команды startJVM на:
jp.startJVM('/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/MacOS/libjli.dylib', "-ea")
c = jp.JClass('blah.HelloWorldJPype')
# Where my java class file is in ./blah/HelloWorldJPype.class
...
Благодаря моему собственному опыту, пытающемуся запустить некоторый Java-код изнутри python ia, похоже на то, как код python работает в java-коде в python, мне не удалось найти прямую методологию.
Мое решение к моей проблеме был запущен этот java-код в виде скриптов beanshell, вызвав интерпретатор beanshell как оболочку commnad из моего кода на Python после редактирования кода Java во временном файле с соответствующими пакетами и переменными.
Если что я говорю, полезно в любом случае, я рад помочь вам поделиться более подробными сведениями о моих решениях.