Jython импортирует модуль, изменив sys.path в PyInterpreter, и состояние pysystem по-прежнему вызывает ошибку импорта

#java #python-2.7 #frameworks #jython #jython-2.7

Вопрос:

Вот очень простая разработка указанной проблемы.

У меня есть один main.java сценарий, состоящий из следующего кода;

 // main.java

public class Main {
    public static void main(String[] args) {
        System.out.println("\\ Interpreter \\");
        test_terpreter();
        System.out.println("\\ SystemState \\");
        test_systate();
    }

// test_terpreter
    public static void test_terpreter() {
         String package_path = "C:\Users\User\Documents\Programming\Java\far_away_package";
         PythonInterpreter interpreter = new PythonInterpreter();

         interpreter.exec(String.format("import sys; sys.path.append('%s');sys_path = sys.path;", package_path));
         System.out.format("SYSPATH IS: %sn", interpreter.get("sys_path").toString());
         System.out.format("IN SPECIFIED PATH IS: %sn", String.join(", ", new File(package_path).list()));
         try {
             interpreter.exec(String.format("import sys;sys.path.append('%s');import MyModule;", package_path));
         } catch (PyException e) {
             System.out.println("ImportError: No module named MyModule (BY INTERPRETER)");
         }
    }

// test_systate

    public static void test_systate() {
        String package_path = "C:\Users\User\Documents\Programming\Java\far_away_package";

        PySystemState sys = new PySystemState();
        sys.path.append(Py.newString(package_path));
        System.out.format("SYSPATH IS: %sn", sys.path.toString());
        System.out.format("IN SPECIFIED PATH IS: %sn", String.join(", ", new File(package_path).list()));

        PyObject importer = sys.getBuiltins().__getitem__(Py.newString("__import__"));
        try {
        PyObject module = importer.__call__(Py.newString("MyModule"));
        } catch (PyException e) {
        System.out.println("ImportError: No module named MyModule (BY SYSTATE)");
        }
    }
}
 

Учитывая приведенный выше тестовый случай, при запуске сценария это sysdout,

 \ Interpreter \
SYSPATH IS: ['C:\jython2.7.2\Lib', '__classpath__', '__pyclasspath__/', 'C:\jython2.7.2\Lib\site-packages', 'C:\Users\User\Documents\Programming\Java\far_away_package']
IN SPECIFIED PATH IS: MyModule.py
ImportError: No module named MyModule (BY INTERPRETER)
\ SystemState \
SYSPATH IS: ['C:\jython2.7.2\Lib', '__classpath__', '__pyclasspath__/', 'C:\Users\User\Documents\Programming\Java\far_away_package']
IN SPECIFIED PATH IS: MyModule.py
ImportError: No module named MyModule (BY SYSTATE)
 

Это демонстрирует, что ни интерпретатор Jython, ни состояние системы не смогли успешно найти модуль; при условии, что системный путь был изменен специально для того, чтобы папка, в которой находится модуль, находилась внутри sys.path .

Я также распечатал содержимое указанной папки, чтобы убедиться, что файл действительно существует.

Заранее спасибо за любую помощь!

P.S. Я могу гарантировать, что это вызывает ошибку импорта как таковую (если кто-то может подозревать, что перехват PyException может означать много других вещей, вот обратная связь без блока перехвата

 Exception in thread "main" Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named MyModule