如何让 Maven 与 Python 子进程一起工作?
How to get Maven to work with Python 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>
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
下一步,我向子进程提供 mvn
二进制文件的完整路径:
import subprocess
args = ['/usr/local/Cellar/maven/3.2.3/libexec/bin/mvn', '-version']
process = subprocess.Popen(args, stderr=subprocess.PIPE)
out, err = process.communicate()
此命令更进一步,但打印 err
显示以下投诉:
Error: JAVA_HOME is not defined correctly.
We cannot execute /usr/libexec/java_home/bin/java
作为完整性检查,我在自己的终端上验证 JAVA_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 派生的子进程应该从 parent 进程继承环境。所以我不确定关于你的 JAVA_HOME env 变量的错误是从哪里来的。难道你没有从与 mvn -version
测试相同的终端生成 Python 吗?
请注意,您可以通过 env
参数将 child 的环境显式修改为 Popen()
。
使用
process = subprocess.Popen(args,shell=True)
我遇到了类似的问题并花了将近一个小时,但很容易解决。大多数人错误地使用 mvn 而不是 mvn.cmd 我们必须使用 mvn.cmd 因为 mvn 是 window 命令应用程序....
import subprocess
proc = subprocess.Popen(['mvn.cmd' , '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = proc.communicate()
print(stdout, stderr)
我正在尝试编写 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
下一步,我向子进程提供 mvn
二进制文件的完整路径:
import subprocess
args = ['/usr/local/Cellar/maven/3.2.3/libexec/bin/mvn', '-version']
process = subprocess.Popen(args, stderr=subprocess.PIPE)
out, err = process.communicate()
此命令更进一步,但打印 err
显示以下投诉:
Error: JAVA_HOME is not defined correctly.
We cannot execute /usr/libexec/java_home/bin/java
作为完整性检查,我在自己的终端上验证 JAVA_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 派生的子进程应该从 parent 进程继承环境。所以我不确定关于你的 JAVA_HOME env 变量的错误是从哪里来的。难道你没有从与 mvn -version
测试相同的终端生成 Python 吗?
请注意,您可以通过 env
参数将 child 的环境显式修改为 Popen()
。
使用
process = subprocess.Popen(args,shell=True)
我遇到了类似的问题并花了将近一个小时,但很容易解决。大多数人错误地使用 mvn 而不是 mvn.cmd 我们必须使用 mvn.cmd 因为 mvn 是 window 命令应用程序....
import subprocess
proc = subprocess.Popen(['mvn.cmd' , '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = proc.communicate()
print(stdout, stderr)