从Java调用python模块时出错

时间:2016-07-27 07:33:48

标签: java python jython-2.7

调用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);

追溯(最里面的):

  

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

     

ImportError:没有名为subprocess的模块

但是如果我使用终端python PatchUtility.py

直接执行python文件,则已经安装了子进程并运行

更新:我找到了一些东西

  

Jython有一些限制:

     

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

子进程内部调用C扩展吗?

1 个答案:

答案 0 :(得分:1)

简而言之:不,或许。或者是的。 但最重要的是,在Jython,No。

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

python文档中的细节有点粗略,但PEP有更多细节(https://www.python.org/dev/peps/pep-0324/)。这是它应该如何工作的规范,而不是实际的实现:Python的实现可以做任何它喜欢的东西,只要它在功能上是相同的(没问题,使它不是'无论如何'它喜欢但是......你明白了。)

来自规范:

  
      
  • 在POSIX平台上,不需要扩展模块:模块      使用os.fork(),os.execvp()等。
  •   
  • 在Windows平台上,该模块需要Mark Hammond's      Windows扩展[5],或称为的小扩展模块      _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交互工作。