总体来说,我正在尝试自动化使用 Maven 进行构建并部署到 Web 逻辑服务器的部署过程。小图片是我正在使用 subprocess 来查看是否可以从 python 中调用 Maven。当我尝试此子进程时,将 mvn 误认为是文件。 这是到目前为止我的代码:
import subprocess
def main():
print(subprocess.check_output(["mvn", "-v"]))
if __name__ == '__main__':
main()
这是我的错误:
C:\pythondev\python.exe "C:/pythondev/development/deployment scripts/redploy-to-localhost.py"
Traceback (most recent call last):
File "C:/pythondev/development/deployment scripts/redploy-to-localhost.py", line 9, in <module>
main()
File "C:/pythondev/development/deployment scripts/redploy-to-localhost.py", line 5, in main
subprocess.check_output(["a"])
File "C:\pythondev\lib\subprocess.py", line 376, in check_output
**kwargs).stdout
File "C:\pythondev\lib\subprocess.py", line 453, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\pythondev\lib\subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "C:\pythondev\lib\subprocess.py", line 1155, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
Process finished with exit code 1
虽然我的问题与子流程有关,但我愿意接受建议更好替代方案的答案。
最佳答案
我遇到了同样的问题,并且犹豫是否使用 shell=True
,因为互联网告诉我这是邪恶的。
当我在 cmd.exe 中运行 where mvn
时,我可以看到有两个匹配项:
mvn
,这是一个 Unix shell 脚本(以#!/bin/sh
开头),mvn.cmd
,这是一个 Windows 批处理文件。
我认为当您在 cmd.exe
中执行 mvn Something -something
时会发生以下情况:Windows 尝试查找名为 mvn
的可执行文件。它找到 mvn
文件,但意识到该文件不可执行。然后,它尝试查找诸如 mvn.com
、mvn.exe
等文件(请参阅 %PATHEXT%
系统变量)。当它找到 mvn.cmd
时,它就会执行它,每个人都很高兴。
据我了解,subprocess.check_output
(和subprocess.run
等)的问题在于路径“扩展”通过%PATHEXT%
未执行。因此,解决方案是您必须手动提供扩展名并运行命令
print(subprocess.check_output(["mvn.cmd", "-v"]))
关于python - 从 Python 打包/部署 Maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53378973/