【问题标题】:subprocess.run fails to call executable [duplicate]subprocess.run 无法调用可执行文件 [重复]
【发布时间】:2021-08-05 07:35:21
【问题描述】:

我正在尝试从 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'

【问题讨论】:

  • downvoting 在这里似乎有点激烈......这可能是重复的,但它非常简洁,并且很有可能在谷歌搜索中找到该主题。哦,好吧...

标签: python subprocess


【解决方案1】:

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

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

绕过的一种方法是将shell=True 传递给run,但这是not recommended

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

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

【讨论】:

    【解决方案2】:

    java --version 是一个 shell 命令,而不是它自己的可执行文件。你需要通过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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多