Jython - 从文件中读取 PyCode 对象 - ImportError?: No Module name pycode

Jython - Reading PyCode object from file - ImportError?: No Module name pycode

我正在使用 Jython 在我的 Java 应用程序中 运行 Python 编写代码。我正在测试是否可以将一些 Python 代码编译为 PyCode 对象,对其进行序列化、反序列化,然后 运行。我读过的所有内容都表明我应该能够做到这一点,但我一直遇到一个我不明白的错误。我试图创建一个尽可能小的示例来演示我在做什么(请参见下面的代码块)。我也包含了我收到的输出。

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import org.python.core.PyCode;
import org.python.util.PythonInterpreter;
import org.python.util.PythonObjectInputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        PythonInterpreter pi = new PythonInterpreter();

        try {
           PyCode code = pi.compile("print('compiled!')");
           System.out.println("Code: %s".formatted(code));

           pi.exec(code);

           OutputStream os = Files.newOutputStream(Paths.get("compiled_code"), StandardOpenOption.CREATE);
           System.out.println("os: %s".formatted(os));

           ObjectOutputStream oos = new ObjectOutputStream(os);
           System.out.println("oos: %s".formatted(oos));

           oos.writeObject(code);
           oos.close();

           InputStream is = Files.newInputStream(Paths.get("compiled_code"), StandardOpenOption.READ);
           System.out.println("is: %s".formatted(is));

           ByteArrayInputStream bais = new ByteArrayInputStream(is.readAllBytes());
           System.out.println("bais: %s".formatted(bais));

           PythonObjectInputStream pois = new PythonObjectInputStream(bais);
           System.out.println("pois: %s".formatted(pois));

           code = (PyCode)pois.readObject();
           System.out.println("Code: %s".formatted(code));

           pois.close();
              
           pi.exec(code);
        }            
    }
}

这是输出。如您所见,它没有执行第二次,错误似乎来自 Python 而不是来自 IO 问题。它似乎从 readObject()

抛出异常
Code: <code object <module> at 0x2, file "<script>", line 0>
compiled!
os: java.nio.channels.Channels@3bbf9027
oos: java.io.ObjectOutputStream@15e0fe05
is: sun.nio.ch.ChannelInputStream@41bf79da
bais: java.io.ByteArrayInputStream@1a891add
pois: org.python.util.PythonObjectInputStream@62a4417
Exception: ImportError: No module named pycode

一个合理的建议是加载 .py 源代码文件而不是编译后的对象。作为回应,我的测试表明执行 PyCode 对象的速度要快得多,我宁愿不传输源文件,这既是为了代码混淆,也是为了避免最终用户不得不在每个 运行 时间进行编译。

如果能提供任何支持,我将不胜感激。

内部开发人员已确认未在工作。参见 https://github.com/jython/jython/issues/153