Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Maven使用Python子流程?_Python_Maven_Subprocess - Fatal编程技术网

如何让Maven使用Python子流程?

如何让Maven使用Python子流程?,python,maven,subprocess,Python,Maven,Subprocess,我正在尝试编写Python脚本来自动执行一些Maven命令 以下Python代码不起作用: import subprocess args = ['mvn', '-version'] process = subprocess.Popen(args, stdout=subprocess.PIPE) 导致以下错误: Traceback (most recent call last): File "<pyshell#2>", line 1, in <module>

我正在尝试编写Python脚本来自动执行一些Maven命令

以下Python代码不起作用:

import subprocess
args = ['mvn', '-version']
process = subprocess.Popen(args, stdout=subprocess.PIPE)
导致以下错误:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    process = subprocess.Popen(args, stdout=subprocess.PIPE)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
此命令更进一步,但打印
err
会显示以下问题:

Error: JAVA_HOME is not defined correctly.
  We cannot execute /usr/libexec/java_home/bin/java
作为健全性检查,我在自己的终端上验证
JAVA\u HOME
是否正确设置:

$ mvn -version
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T16:58:10-04:00)
Maven home: /usr/local/Cellar/maven/3.2.3/libexec
Java version: 1.8.0_25, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac"
我还能够在终端上轻松地运行
mvn


我的问题是:为什么子流程不能运行
mvn
,我如何才能让它这样做

Python从终端继承环境,从Python派生的子进程应该从父进程继承环境。因此,我不确定JAVA_HOME env变量的错误来自何处。是否可能您没有像使用
mvn-version
测试一样从同一个终端生成Python

请注意,您可以通过
env
参数显式修改子级的环境,以
Popen()

使用

process = subprocess.Popen(args,shell=True)

我也遇到了类似的问题&花了将近一个小时,但很容易解决。大多数人错误地使用mvn而不是mvn.cmd我们必须使用mvn.cmd,因为mvn是窗口命令应用程序

import subprocess

proc = subprocess.Popen(['mvn.cmd' , '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

stdout, stderr = proc.communicate()
print(stdout, stderr)

隐马尔可夫模型。。。似乎应该从调用方继承环境。你能检查一下os.environ['JAVA\u HOME']的值吗?另外,我不确定这是否重要,但不管出于什么原因,错误中隐含的JAVA\u HOME和你的“健全性检查”中的JAVA HOME似乎是不同的路径…@mgilson
os.environ['JAVA\u HOME']
没有定义,但通过在Python中明确定义它,
mvn
子流程调用现在可以工作了。我已经制作了运行JAR的子流程脚本,这些脚本在使用
java
时没有显式定义
env
参数。我想知道是什么导致了mvn出现这个问题,因为我仍然在使用二进制文件的完整路径。我发现控制环境有助于解决您的问题。既然我提议你至少要给我一票赞成票;-)。这似乎更适合作为评论,为什么这不是一个公认的答案?这就是所需要的一切。
import subprocess

proc = subprocess.Popen(['mvn.cmd' , '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

stdout, stderr = proc.communicate()
print(stdout, stderr)