python - 从 Python 打包/部署 Maven

标签 python maven subprocess

总体来说,我正在尝试自动化使用 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.commvn.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/

相关文章:

java - 如何让maven构建依赖项目

java - 部署war包后tomcat的webapps目录下多了很多.aut文件

Python Subprocess call() 不执行shell命令

java - 如何使用 Java/ASP.NEt/Python 编写代码以使用 PHP 编写的基于组件的库?

python - 3d 点云中的平面拟合

Python 记录多个文件

java.lang.NoClassDefFoundError : org/hibernate/boot/MetadataBuilder 错误

python - subprocess.check_output 不接受长参数

python - 使用 subprocess.call 时如何输入 sudo 密码?

python - 根据文件名中是否存在特定字符串,将大约 150 多个 (.csv) 文件中的数据读取为两类