Запустите макрос ImageJ из скрипта Python, ошибка не найдена - PullRequest
1 голос
/ 07 мая 2019

ФОН

Я использую Python2.7 и установил Imagej, следуя инструкциям на www.scivision.dev без каких-либо проблем. Приложение отлично работает при запуске из терминала.

Я использую Java-версию

parovelb@Latitude-E6510:~$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Ubuntu-3ubuntu118.04.3)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Ubuntu-3ubuntu118.04.3, mixed mode, sharing)

Путь к OpenJDK указан в моем ~/.bashrc

# java path
PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin/java:$PATH
export PATH

ВОПРОС

У меня проблемы с запуском макроса ImageJ из моего скрипта в Python2.7. Скрипт вызывает макрос ImageJ с subprocess.Popen. Макрос создает файл CSV и записывает результаты в него. Вот мой сценарий:

#!/usr/bin/python2.7 python2.7
#!/bin/sh -i
# -*- coding: utf-8 -*-


"""
This program runs an ImageJ macro.
"""


import os
import csv
import sys
import subprocess
from subprocess import PIPE, STDOUT
from collections import defaultdict


def Connector_Check():
    cmd = ["imagej", "-macro", "luerlocktest.ijm"]
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
    (stdoutdata, stderrdata) = process.communicate()
    print 'stdoutdata', stdoutdata

    # read result in row 1, col 2
    with open(" ~/results.csv","rb") as res:
        resReader = csv.reader(res)
        resReader = list(resReader)
        val = resReader[1][2]
    print "Connector check value = ", val


if __name__ == "__main__":
    # execute connector check
    Connector_Check()

Если я запускаю команду imagej -macro luerlocktest.ijm из терминала, она работает нормально, но мой скрипт выдает ошибку:

stdoutdata -macro: 1: -macro: imagej: not found

Traceback (most recent call last):
  File "wrapper_imagej.py", line 34, in <module>
    Connector_Check()
  File "wrapper_imagej.py", line 25, in Connector_Check
    with open("/home/parovelb/Desktop/CV/Results.csv","rb") as res:
IOError: [Errno 2] No such file or directory: '/home/parovelb/Desktop/CV/Results.csv'

Эти вопросы и ответы ниже, к сожалению, не предлагают решение моей проблемы:

  1. Как подключить ImageJ к python?
  2. Использование ImageJ Jython в автономной среде Python IDE
  3. Ошибка образа Docker: «/ bin / sh: 1: python: not found»

Любые предложения о том, почему imagej: not found?

1. UPDATE

Использование Shell=False дает ошибку:

Traceback (most recent call last):
  File "wrapper_imagej.py", line 34, in <module>
    Connector_Check()
  File "wrapper_imagej.py", line 20, in Connector_Check
    process = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
  File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Я изменил формат cmd и поместил путь, где ImageJ установлен в $HOME/ImageJ/ImageJ. Также я использовал единственную командную строку вместо списка.

Неправильно:

cmd = ["imagej", "-macro", "luerlocktest.ijm"]

Правильно:

cmd = ["$HOME/ImageJ/ImageJ -macro luerlocktest.ijm"]
0 голосов
/ 07 мая 2019

Открытие оболочки с subprocess не приводит к ее выполнению .bashrc, поэтому она никогда не увидит измененную версию $PATH. Вы можете попробовать добавить аргумент shell=False к вызову Popen(). Другие варианты включают добавление imagej к вашему PATH другим способом или вызов imagej с полным путем к самой программе, вообще не требуя переменной $PATH.

например:

cmd = ["/usr/lib/jvm/java-11-openjdk-amd64/bin/java/imagej", "-macro", "luerlocktest.ijm"]
...