首页 > 解决方案 > 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'

标签: pythonsubprocess

解决方案


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

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

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

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

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

推荐阅读