subprocess.run调用可执行文件失败

18 浏览
0 Comments

subprocess.run调用可执行文件失败

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

import subprocess
subprocess.run("ls") # 可以
subprocess.run("whoami") # 可以
subprocess.run("java --version") # 不可以

我可以运行标准的shell命令,但无法运行Java可执行文件。为什么会这样?

Traceback (most recent call last):
  File "syscall.py", line 4, in 
    subprocess.run("java --version") # 不可以
  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'

0
0 Comments

subprocess.run函数无法调用可执行文件的问题可能是由于以下原因导致的:

1. subprocess.run默认不会使用shell来执行命令,而shell命令和可执行文件的执行方式不同。所以需要在调用subprocess.run时传入shell=True参数,以告诉它使用shell来执行命令。

解决方法如下:

import subprocess
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)

通过上述方法,我们可以成功调用java命令,并获取到相应的输出。

0
0 Comments

subprocess.run调用可执行文件失败的原因是无法直接传递完整的命令给subprocess.run函数。subprocess.run函数接受解析后的命令参数列表,用于启动子进程。

为了绕过这个问题,可以将shell参数设置为True,但是这种方法并不被推荐,因为存在安全风险。

另一种解决方法是使用shlex.split函数自动拆分命令参数列表。

下面是使用shlex.split解决该问题的示例代码:

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

通过使用shlex.split函数,我们可以自动将命令字符串拆分为参数列表,然后传递给subprocess.run函数,从而成功调用可执行文件。

0