当我试图运行任何gradle
命令时,例如subprocess.Popen("gradle --version")
,我得到一个FileNotFoundError
。但是当我用os.system("gradle --version")
或直接从cmd尝试完全相同的命令时,它工作得非常好。在PATH中,我得到了一个“C:\Utils\gradle-6.8.3\bin”
看起来这是一些环境变量的问题,但我似乎找不到任何解决方案。我试着将GRADLE_HOME设置为“C:\Utils\gradle-6.8.3”或“C:\Utils\gradle-6.8.3\bin”,将gradle的不同目录添加到PATH中,但没有任何帮助。
我从Popen成功运行gradle命令的唯一方法是:subprocess.Popen("C:/Utils/gradle-6.8.3/bin/gradle.bat --version")
,但这显然不是一个有效的解决方案。
样本代码:
import os
import subprocess
print("==== os system ====")
os.system("gradle --version")
print("==== os system ====")
print("==== subprocess popen ====")
p = subprocess.Popen("gradle --version", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate()
print(f"return code: {p.returncode}")
print("==== subprocess popen ====")
输出:
==== os system ====
------------------------------------------------------------
Gradle 6.8.3
------------------------------------------------------------
Build time: 2021-02-22 16:13:28 UTC
Revision: 9e26b4a9ebb910eaa1b8da8ff8575e514bc61c78
Kotlin: 1.4.20
Groovy: 2.5.12
Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM: 1.8.0-adoptopenjdk (Oracle Corporation 25.71-b00)
OS: Windows 10 10.0 amd64
==== os system ====
==== subprocess popen ====
Traceback (most recent call last):
File "c:\Projects\Tanks\tanks\Buildmachine\BuildScripts\test.py", line 12, in <module>
p = subprocess.Popen("gradle --version", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 969, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1438, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] Не удается найти указанный файл
顺便说一句,这些工作罚款:subprocess.Popen("node --version")
、subprocess.Popen("python --version")
最奇怪的是,在3台PC中,有1台的gradle
命令实际上是从Popen
工作的。我发现的唯一区别是,“工作机器”有Gradle_HOME设置,并使用巧克力安装的Gradle,在PATH中没有Gradle。所有机器都有相同的python和gradle版本,并且都有Windows 10。设置与“工作机器”上相同的环境变量配置没有帮助,所以也许还有其他巧克力做了,我没有?
1条答案
按热度按时间2admgd591#
如果你想将
os.system
的相同字符串传递给subprocess.Popen
,那么你应该添加shell=True
:调用
subprocess.Popen
的另一种方法是传递一个参数列表:您可以查看Popen的第一个参数
args
的文档,args应该是程序参数序列,或者是单个字符串或类似路径的对象。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是一个字符串,则解释是依赖于平台的,并在下面描述。