从 Java 调用 python 模块时出错
Error in Calling python module from Java
Java 调用代码 Python:
//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);
追溯(最里面的最后一个):
File "/scratch/app/product/fmw/obpinstall/patching/scripts/PatchUtility.py", line 4, in ?
ImportError: no module named subprocess
但是子进程已经安装,如果我直接使用终端 python PatchUtility.py
执行 python 文件,它就会运行
更新:我发现了一些东西
Jython has some limitations:
There are a number of differences. First, Jython programs cannot use CPython
extension modules written in C. These modules usually have files with the
extension .so, .pyd or .dll.
子进程是否在内部调用 C 扩展?
简而言之:不。或者也许。或者是的。 但与您最相关的是,在 Jython 中,没有。
TLDR:Jython 有自己的子流程实现
python 文档中的细节有些粗略,但是 PEP 有更多细节 (https://www.python.org/dev/peps/pep-0324/)。这是它应该如何工作的规范,而不是实际的实现: Python 的实现可以做任何它喜欢的事情,只要它的功能相同(好吧,让它不是 'whatever' 它喜欢但是......你明白了)。
来自规范:
- On POSIX platforms, no extension module is required: the module
uses os.fork(), os.execvp() etc.
- On Windows platforms, the module requires either Mark Hammond's
Windows extensions[5], or a small extension module called
_subprocess.
Subprocess PEP 旨在防止使用 os.popen
类型函数时发生的奇怪情况,但是我还在 Jython 文档中注意到这是为 jython 实现的,os.fork 和整个子进程模块本身:http://www.jython.org/docs/library/subprocess.html
我怀疑您在某处还有另一个错误,并且可能是一个导入错误,这使得它看起来像是无法导入的子进程。
您提到的 C 模块更多是关于自定义 python c 模块。这些不起作用,因为它们绑定到 python 函数,而 jython 使用 Java 位实现其内部结构。该语言提供的所有核心功能都必须移植到 Java 才能使 java 交互正常工作。
Java 调用代码 Python:
//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);
追溯(最里面的最后一个):
File "/scratch/app/product/fmw/obpinstall/patching/scripts/PatchUtility.py", line 4, in ?
ImportError: no module named subprocess
但是子进程已经安装,如果我直接使用终端 python PatchUtility.py
更新:我发现了一些东西
Jython has some limitations:
There are a number of differences. First, Jython programs cannot use CPython extension modules written in C. These modules usually have files with the extension .so, .pyd or .dll.
子进程是否在内部调用 C 扩展?
简而言之:不。或者也许。或者是的。 但与您最相关的是,在 Jython 中,没有。
TLDR:Jython 有自己的子流程实现
python 文档中的细节有些粗略,但是 PEP 有更多细节 (https://www.python.org/dev/peps/pep-0324/)。这是它应该如何工作的规范,而不是实际的实现: Python 的实现可以做任何它喜欢的事情,只要它的功能相同(好吧,让它不是 'whatever' 它喜欢但是......你明白了)。
来自规范:
- On POSIX platforms, no extension module is required: the module uses os.fork(), os.execvp() etc.
- On Windows platforms, the module requires either Mark Hammond's Windows extensions[5], or a small extension module called _subprocess.
Subprocess PEP 旨在防止使用 os.popen
类型函数时发生的奇怪情况,但是我还在 Jython 文档中注意到这是为 jython 实现的,os.fork 和整个子进程模块本身:http://www.jython.org/docs/library/subprocess.html
我怀疑您在某处还有另一个错误,并且可能是一个导入错误,这使得它看起来像是无法导入的子进程。
您提到的 C 模块更多是关于自定义 python c 模块。这些不起作用,因为它们绑定到 python 函数,而 jython 使用 Java 位实现其内部结构。该语言提供的所有核心功能都必须移植到 Java 才能使 java 交互正常工作。