![](/img/trans.png)
[英]Make ImageJ/ Fiji Jython script with ij and loci classes work from bash script
[英]Importing external libraries/Packages from an ImageJ/Fiji script
我正在使用Fiji腳本編輯器在Jython中編寫imageJ / Fiji插件。 我需要導入外部數值庫,例如ParallelColt,以幫助我處理多維矩陣。
我從ParallelColt開始,將其jar文件放在斐濟內部的java文件夾中:“ Fiji.app/java/macosx-java3d/Home/lib/ext”,然后嘗試通過編寫以下內容來導入:“ import ParallelColt”或更具體地是“ from “ ParallelColt import jplasma”,但出現未找到模塊的錯誤。
我嘗試將罐子放在Fiji plugins文件夾中,但仍然沒有成功。 我還嘗試通過將文件夾與ParallelColt的所有Java類一起使用,而不是jar文件,但仍然無法從腳本中導入這些類。
也許我只是問一個問題,即如何從Jython腳本導入Java庫。 任何幫助將不勝感激。
這里有兩個問題。
為了依賴具有多個JAR文件的復雜的第三方軟件項目,您需要確保已將項目的所有依賴項(即,它需要的所有JAR文件)放入ImageJ.app/jars
。
一種方法是找到Maven Central上的依賴項 ,然后使用Maven或Gradle之類的構建工具下載它們。
在您的情況下,可以通過制作以下pom.xml
文件來使用Maven做到這一點:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dummy</groupId>
<artifactId>dummy</artifactId>
<version>0.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>net.sourceforge.parallelcolt</groupId>
<artifactId>parallelcolt</artifactId>
<version>0.10.1</version>
</dependency>
<dependency>
<groupId>net.mikera</groupId>
<artifactId>vectorz</artifactId>
<version>0.34.0</version>
</dependency>
</dependencies>
</project>
然后執行:
mvn dependency:copy-dependencies
這將在target/dependencies
文件夾中產生以下文件:
29087 AMDJ-1.0.1.jar
8687 BTFJ-1.0.1.jar
19900 COLAMDJ-1.0.1.jar
55638 JKLU-1.0.0.jar
1194003 arpack_combined_all-0.1.jar
31162 core-lapack-0.1.jar
212836 csparsej-1.1.1.jar
88639 edn-java-0.4.4.jar
91793 jplasma-1.2.0.jar
762778 jtransforms-2.4.0.jar
237344 junit-4.8.2.jar
8693 mathz-0.3.0.jar
131210 netlib-java-0.9.3.jar
66134 optimization-1.0.jar
4111744 parallelcolt-0.10.1.jar
14028 randomz-0.3.0.jar
593015 vectorz-0.34.0.jar
將它們移到ImageJ.app/jars
文件夾中,就可以了,盡管請注意同一庫的多個版本,因為ImageJ現在無法處理該版本。
from ParallelColt import jplasma
的行無效。 也就是說,沒有ParallelColt.jplasma
Java類或包。 您可以從命令行親自驗證:
$ find-class() { for f in *.jar; do result=$(jar tf "$f" | grep -l "$@"); if [ "$result" != "" ]; then echo $f; fi; done; }
$ cd ImageJ.app/jars
$ find-class jplasma
兩個JAR文件具有包含該字符串的類:
core-lapack-0.1.jar
jplasma-1.2.0.jar
快速瀏覽一下它們,可以發現程序包名稱並非以ParallelColt
開頭:
$ jar tf jplasma-1.2.0.jar | grep jplasma
edu/emory/mathcs/jplasma/
edu/emory/mathcs/jplasma/benchmark/
edu/emory/mathcs/jplasma/test/
edu/emory/mathcs/jplasma/tdouble/
edu/emory/mathcs/jplasma/example/
edu/emory/mathcs/jplasma/benchmark/DgelsBenchmark.class
edu/emory/mathcs/jplasma/benchmark/DposvBenchmark.class
edu/emory/mathcs/jplasma/benchmark/DgesvBenchmark.class
edu/emory/mathcs/jplasma/Barrier.class
edu/emory/mathcs/jplasma/test/DposvTest.class
edu/emory/mathcs/jplasma/test/DgelsTest.class
edu/emory/mathcs/jplasma/test/DgesvTest.class
edu/emory/mathcs/jplasma/tdouble/Dgels.class
edu/emory/mathcs/jplasma/tdouble/Dgeqrf.class
edu/emory/mathcs/jplasma/tdouble/Dglobal$Dplasma_cntrl.class
edu/emory/mathcs/jplasma/tdouble/Dplasma.class
...
edu/emory/mathcs/jplasma/tdouble/Dglobal$Dplasma_aux.class
edu/emory/mathcs/jplasma/tdouble/Pdormqr.class
edu/emory/mathcs/jplasma/example/DposvExample.class
edu/emory/mathcs/jplasma/example/DgesvExample.class
edu/emory/mathcs/jplasma/example/DgelsExample.class
相反,如果您想使用edu.emory.mathcs.jplasma.tdouble.Dplasma
,則需要將其導入為:
from edu.emory.mathcs.jplasma.tdouble import Dplasma
這是來自JPlasma發行版的DgelsExample.java的端口,可在ImageJ腳本編輯器中使用:
from edu.emory.mathcs.jplasma.tdouble import Dplasma
from java.lang import Math
import jarray
M = 15;
N = 10;
NRHS = 5;
A = jarray.zeros(M * N, 'd')
B = jarray.zeros(M * NRHS, 'd')
# Initialize A
for i in range(0, M):
for j in range(0, N):
A[M * j + i] = 0.5 - Math.random()
# Initialize B
for i in range(0, M):
for j in range(0, NRHS):
B[M * j + i] = Math.random()
# Plasma Initialize
Dplasma.plasma_Init(M, N, NRHS)
# Allocate T
T = Dplasma.plasma_Allocate_T(M, N)
# Solve the problem
INFO = Dplasma.plasma_DGELS(Dplasma.PlasmaNoTrans, M, N, NRHS, A, 0, M, T, 0, B, 0, M)
# Plasma Finalize
Dplasma.plasma_Finalize()
if INFO < 0:
print("-- Error in DgelsExample example !")
else:
print("-- Run successfull !")
有關編寫Jython腳本的更多信息,請參見ImageJ Wiki的Jython腳本頁面。
最后一個分期評論:ImageJ腳本編輯器實際上是一種工具,用於開發依賴於安裝中已經存在的組件的單類腳本和插件。 我對這樣一個具有很多依賴項的項目的建議是,改為使用諸如Eclipse之類的IDE在Java中進行編碼,因為此類IDE提供了更多的生產力增強功能。 您可以使用基於AST的自動完成功能來瀏覽正在使用的庫的API,並且無需進行網絡搜索即可輕松瀏覽javadocs和源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.