Qual é a melhor maneira de chamar java de python? (jython e RPC não são uma opção para mim).
Ouvi falar do JCC: http://pypi.python.org/pypi/JCC/1.9, um gerador de código C ++ para chamar Java a partir de C ++ / Python. Mas isso requer a compilação de todas as chamadas possíveis; Eu preferiria outra solução.
Ouvi falar do JPype: http://jpype.sourceforge.net/ tutorial: http://www.slideshare.net/onyame/mixing-python-and-java
import jpype
jpype.startJVM(path to jvm.dll, "-ea")
javaPackage = jpype.JPackage("JavaPackageName")
javaClass = javaPackage.JavaClassName
javaObject = javaClass()
javaObject.JavaMethodName()
jpype.shutdownJVM()
Parece o que eu preciso. No entanto, o último lançamento é de janeiro de 2009 e vejo pessoas que não conseguem compilar o JPype.
O JPype é um projeto morto?
Há alguma outra alternativa?
Atenciosamente, David
Respostas:
Aqui está o meu resumo deste problema: 5 maneiras de chamar Java a partir de Python
http://baojie.org/blog/2014/06/16/call-java-from-python/ (em cache )
Resposta curta: O Jpype funciona muito bem e é comprovado em muitos projetos (como python-boilerpipe), mas o Pyjnius é mais rápido e mais simples que o JPype
Eu tentei Pyjnius / Jnius, JCC, javabridge, Jpype e Py4j.
O Py4j é um pouco difícil de usar, pois você precisa iniciar um gateway, adicionando outra camada de fragilidade.
fonte
Você também pode usar o Py4J . Há um exemplo na página inicial e muita documentação, mas, basicamente, você chama os métodos Java do seu código python como se fossem métodos python:
Ao contrário do Jython, uma parte do Py4J é executada na VM do Python, por isso está sempre "atualizada" com a versão mais recente do Python e você pode usar bibliotecas que não funcionam bem no Jython (por exemplo, lxml). A outra parte é executada na Java VM que você deseja chamar.
A comunicação é feita através de soquetes, em vez de JNI e o Py4J possui seu próprio protocolo (para otimizar certos casos, gerenciar memória, etc.)
Disclaimer: Eu sou o autor de Py4J
fonte
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
Aqui a classe Base64 possui o método encode () e decode () e faz parte do pacotech.ethz.ssh2.crypto
no meu arquivo .jar. Eu recebofrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Documentos: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
Na página do github:
fonte
Estou no OSX 10.10.2 e consegui usar o JPype.
Ocorreu um problema de instalação com o Jnius ( outros também ), o Javabridge instalou, mas cometeu erros misteriosos quando tentei usá-lo, o PyJ4 tem esse inconveniente de ter que iniciar um servidor Gateway em Java primeiro, o JCC não instalaria. Finalmente, o JPype acabou funcionando. Existe uma bifurcação mantida do JPype no Github. Possui as principais vantagens de que (a) é instalado corretamente e (b) pode converter de maneira muito eficiente matrizes java em matrizes numpy (
np_arr = java_arr[:]
)O processo de instalação foi:
E você deve ser capaz de
import jpype
A seguinte demonstração funcionou:
Quando tentei chamar meu próprio código java, tive que primeiro compilar (
javac ./blah/HelloWorldJPype.java
) e alterar o caminho da JVM do padrão (caso contrário, você obterá erros inexplicáveis de "classe não encontrada"). Para mim, isso significou alterar o comando startJVM para:fonte
Se você está no Python 3, há um fork do JPype chamado JPype1-py3
Isso funciona para mim no OSX / Python 3.4.3. (Você pode precisar
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)fonte
Ultimamente, venho integrando muitas coisas no Python, incluindo Java. O método mais robusto que encontrei é usar o IKVM e um wrapper C #.
O IKVM possui um aplicativo pequeno e elegante que permite pegar qualquer Java JAR e convertê-lo diretamente em .Net DLL. Ele simplesmente converte o bytecode da JVM em bytecode do CLR. Consulte http://sourceforge.net/p/ikvm/wiki/Ikvmc/ para obter detalhes.
A biblioteca convertida se comporta como uma biblioteca C # nativa e você pode usá-la sem precisar da JVM. Em seguida, você pode criar um projeto de wrapper C # DLL e adicionar uma referência à DLL convertida.
Agora você pode criar alguns stubs de invólucro que chamam os métodos que você deseja expor e marcar esses métodos como DllEport. Consulte https://stackoverflow.com/a/29854281/1977538 para obter detalhes.
A DLL do wrapper atua como uma biblioteca C nativa, com os métodos exportados parecidos com os métodos C exportados. Você pode se conectar a eles usando o ctype como de costume.
Eu tentei com o Python 2.7, mas deve funcionar com o 3.0 também. Funciona em Windows e Linux
Se você usa C #, provavelmente esta é a melhor abordagem para tentar ao integrar quase tudo ao python.
fonte
Estou começando a usar o JPype 0.5.4.2 (julho de 2011) e parece que está funcionando bem ...
Estou no Xubuntu 10.04
fonte
Estou assumindo que, se você pode passar de C ++ para Java, está tudo pronto. Eu já vi um produto do tipo que você mencionou funcionar bem. Por acaso, o que usamos foi o CodeMesh . Não estou endossando especificamente esse fornecedor ou fazendo qualquer declaração sobre a qualidade relativa de seus produtos, mas já o vi funcionar em um cenário de volume bastante alto.
Eu diria que, se possível, eu recomendaria evitar a integração direta via JNI, se puder. Alguma abordagem simples de serviço REST ou arquitetura baseada em fila tenderá a ser mais simples de desenvolver e diagnosticar. Você pode obter um desempenho bastante decente se usar essas tecnologias dissociadas com cuidado.
fonte
Através da minha própria experiência tentando executar algum código java no python, de maneira semelhante a como o código python é executado dentro do código java no python, não consegui encontrar uma metodologia direta.
Minha solução para o meu problema foi executar esse código java como scripts de casca de feijão, chamando o interpretador de casca de feijão como um commnad de shell no meu código python após editar o código java em um arquivo temporário com os pacotes e variáveis apropriados.
Se o que estou falando é útil de alguma maneira, fico feliz em ajudá-lo a compartilhar mais detalhes de minhas soluções.
fonte