Использование скрипта Python в Java (Eclipse) - PullRequest
6 голосов
/ 22 июня 2011

Я хотел включить Python Script, созданный для меня другом, в приложение Java, которое я пытаюсь разработать.После некоторых проб и ошибок я наконец узнал о Jython и использовал PythonInterpreter, чтобы попытаться запустить скрипт.

Однако, при попытке запустить его, я получаю сообщение об ошибке в скрипте Python.Это странно, потому что когда я пытаюсь запустить скрипт за пределами Java (в данном случае Eclipse IDE), скрипт работает нормально и делает именно то, что мне нужно (извлечь все изображения из файлов .docx, хранящихся в той же директории).

Может кто-нибудь помочь мне здесь?

Java:

import org.python.core.PyException;
import org.python.util.PythonInterpreter;

public class SPImageExtractor
{
    public static void main(String[] args) throws PyException
    {   
        try
        {
            PythonInterpreter.initialize(System.getProperties(), System.getProperties(), new String[0]);
            PythonInterpreter interp = new PythonInterpreter();
            interp.execfile("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Image-Extractor2.py");
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
            e.printStackTrace();
        }
    }
}

Ошибка Java относительно скрипта Python:

Traceback (большинствопоследний вызов последний):
Файл "C: / Documents and Settings / пользователь / рабочая область / Внутренний проект / Предложения / Преобразованные предложения / Image-Extractor2.py", строка 19, в thisDir, _ = path.split (путь.abspath (argv [0])) IndexError: индекс выходит за пределы диапазона: 0 Трассировка (последний последний вызов):
Файл "C: / Документы и настройки / Пользователь / Рабочая область / Внутренний проект / Предложения / Преобразованные предложения / Изображение-Extractor2.py ", строка 19, в thisDir, _ = path.split (path.abspath (argv [0])) IndexError: индекс вне диапазона: 0


Питон:

from os import path, chdir, listdir, mkdir, gcwd
from sys import argv
from zipfile import ZipFile
from time import sleep

#A few notes -
#(1) when I do something like " _,variable = something ", that is because
#the function returns two variables, and I only need one.  I don't know if it is a
#common convention to use the '_' symbol as the name for the unused variable, but
#I saw it in some guy's code in the past, and I started using it.
#(2) I use "path.join" because on unix operating systems and windows operating systems
#they use different conventions for paths like '\' vs '/'.  path.join works on all operating
#systems for making paths.

#Defines what extensions to look for within the file (you can add more to this)
IMAGE_FILE_EXTENSIONS = ('.bmp', '.gif', '.jpg', '.jpeg', '.png', '.tif', '.tiff')

#Changes to the directory in which this script is contained
thisDir = getcwd()
chdir(thisDir)

#Lists all the files/folders in the directory
fileList = listdir('.')
for file in fileList:

    #Checks if the item is a file (opposed to being a folder)
    if path.isfile(file):

        #Fetches the files extension and checks if it is .docx
        _,fileExt = path.splitext(file)
        if fileExt == '.docx':

            #Creates directory for the images
            newDirectory = path.join(thisDir, file + "-Images")
            if not path.exists(newDirectory):
                mkdir(newDirectory)

            currentFile = open(file,"r")
            for line in currentFile:
                print line

            sleep(5)



            #Opens the file as if it is a zipfile
            #Then lists the contents
            try:
                zipFileHandle = ZipFile(file)
                nameList = zipFileHandle.namelist()

                for archivedFile in nameList:
                    #Checks if the file extension is in the list defined above
                    #And if it is, it extracts the file
                    _,archiveExt = path.splitext(archivedFile)
                    if archiveExt in IMAGE_FILE_EXTENSIONS:
                        zipFileHandle.extract(archivedFile, newDirectory)
            except:
                pass

1 Ответ

2 голосов
/ 22 июня 2011

Я предполагаю, что вы не получите аргументы командной строки, если вызывается интерпретатор (не удивительно, где он должен получить правильные значения? [Или какое будет правильное значение?]).

os.getcwd ()

Return a string representing the current working directory.

Вернет рабочий каталог, но, вероятно, это не то, что вы хотите.

Не проверено, но я думаю, что os.path.dirname (os.path.realpath (__ file__)) должно работать предположительно (Примечание: уберите пробел там; я должен рассмотреть детали форматирования немного позже ~)

...