0

调用 Python 的 Java 代码:

//arguments to be passed to the script
String[] patchArguments = { patchFileDirectory,centralPatchStagePath,patchId,patchFileName, action };
//initialize the interpreter with properties and arguments
PythonInterpreter.initialize(System.getProperties(), System.getProperties(), patchArguments);
pythonInterpreter = new PythonInterpreter();
//invoke python interpreter to execute the script
pythonInterpreter.execfile(opatchScriptPath + opatchScript);

Traceback(最里面的最后一个):

文件“/scratch/app/product/fmw/obpinstall/patching/scripts/PatchUtility.py”,第 4 行,在?

ImportError:没有名为子进程的模块

但是子进程已经安装,如果我直接使用终端执行 python 文件,它就会运行python PatchUtility.py

更新:我发现了一些东西

Jython 有一些限制:

有许多不同之处。首先,Jython 程序不能使用用 C 编写的 CPython 扩展模块。这些模块通常具有扩展名为 .so、.pyd 或 .dll 的文件。

subprocess 是否在内部调用 C 扩展?

4

1 回答 1

1

简而言之:不。或者也许。或者是。但与您最相关的是 Jython,No.

TLDR:Jython 有自己的子流程实现

python 文档中的细节有点粗略,但是 PEP 有更多细节(https://www.python.org/dev/peps/pep-0324/)。这是关于它应该如何工作的规范,而不是实际的实现:Python 的实现可以做任何它喜欢的事情,只要它的功能相同(好吧,让它不是它喜欢的“任何东西”,但是......你明白了)。

从规范:

  • 在 POSIX 平台上,不需要扩展模块:该模块使用 os.fork()、os.execvp() 等。
  • 在 Windows 平台上,该模块需要 Mark Hammond 的 Windows 扩展[5],或称为 _subprocess 的小型扩展模块。

子进程 PEP 旨在防止使用os.popen类型函数时发生的怪事,但是我还在 Jython 文档中注意到这是为 jython 实现的,包括 os.fork 和整个子进程模块本身:http://www .jython.org/docs/library/subprocess.html

我怀疑你在某个地方还有另一个错误,也许是一个导入错误,这使它看起来像它的子进程无法导入。

您所指的 C 模块更多地是关于自定义 python c 模块。这些不起作用,因为它们与 python 函数绑定,而 jython 使用 Java 位实现其内部。该语言提供的所有核心功能都必须已移植到 Java 才能使 Java 交互工作。

于 2016-07-27T10:41:40.903 回答