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
我正在使用 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