gradle Popen抛出FileNotFoudError,但os.system成功运行了该命令

cygmwpex  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(121)

当我试图运行任何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。设置与“工作机器”上相同的环境变量配置没有帮助,所以也许还有其他巧克力做了,我没有?

2admgd59

2admgd591#

如果你想将os.system的相同字符串传递给subprocess.Popen,那么你应该添加shell=True

p = subprocess.Popen("gradle --version", shell=True)

调用subprocess.Popen的另一种方法是传递一个参数列表:

p = subprocess.Popen(["gradle", "--version"])

您可以查看Popen的第一个参数args的文档,
args应该是程序参数序列,或者是单个字符串或类似路径的对象。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是一个字符串,则解释是依赖于平台的,并在下面描述。

相关问题