subprocess.run无法调用可执行文件



我正在尝试从Python程序中执行Java程序。

import subprocess
subprocess.run("ls") # ok
subprocess.run("whoami") # ok
subprocess.run("java --version") # not ok

我可以运行标准的shell命令,但不能运行Java可执行文件。为什么?

Traceback (most recent call last):
File "syscall.py", line 4, in <module>
subprocess.run("java --version") # not ok
File "/usr/lib/python3.6/subprocess.py", line 423, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'java --version': 'java --version'

不能将完整的命令传递给subprocess.run。它接受用于启动子流程的已解析的令牌列表。

subprocess.run(["java", "--version"])
subprocess.run(["ls", "-l"])

绕过的一种方法是将shell=True传递给run,但不建议这样做。

您也可以使用shlex.split自动进行拆分

subprocess.run(shlex.split("java --version"))

java --versionshell命令,而不是自己的可执行文件。你需要通过shell=True

subprocess.run("java -version", shell=True)

顺便说一下,java对所有内容都使用一个短划线,所以我将命令更改为java -version

示例输出:

>>> import subprocess
>>> subprocess.run("java -version", shell=True)
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~20.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
CompletedProcess(args='java -version', returncode=0)

最新更新