重要的是,我正在尝试自动化使用maven构建并部署到web逻辑服务器的部署过程。小图片是,我正在使用子流程来查看是否可以从python中调用maven。当我尝试此子流程时,会将mvn错误为文件。这是我到目前为止的代码:
import subprocess
def main():
print(subprocess.check_output(["mvn", "-v"]))
if __name__ == '__main__':
main()
这是我的错误:
C:pythondevpython.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:pythondevlibsubprocess.py", line 376, in check_output
**kwargs).stdout
File "C:pythondevlibsubprocess.py", line 453, in run
with Popen(*popenargs, **kwargs) as process:
File "C:pythondevlibsubprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "C:pythondevlibsubprocess.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"]))
试试这个,它对我有效。
print(subprocess.check_output(["mvn", "-v"], shell=True))