首页 > 解决方案 > 为什么 python subprocess 命令在通过 API 调用执行时得到 [Errno 2] No such file or directory: 'ls': 'ls'

问题描述

subprocess通过调用使用 Gunicorn 公开的 Flask 开发的 API 来运行一个简单的命令,无论命令是什么,我都会收到错误:[Errno 2] No such file or directory:

代码示例

from .. import app
from flask import request, jsonify
import logging
import subprocess
from datetime import datetime
from subprocess import Popen, PIPE
from subprocess import check_output

def get_shell_script_output_using_communicate():
    session = subprocess.Popen('ls', stdout=PIPE, stderr=PIPE)
    stdout, stderr = session.communicate()
    if stderr:
        raise Exception("Error "+str(stderr))
    return stdout.decode('utf-8')


@app.route("/api/start_command", methods=['POST'])
def start_command():
    logging.basicConfig(filename='/home/import.log', level=logging.INFO)
    out = get_shell_script_output_using_communicate()
    logging.info("{} {} {} ".format(datetime.now(), "command finished", out))

当然,预期的输出是记录ls命令结果。

我可以在(让我说)非 Web 服务模式下运行相同的命令而没有任何问题。我还尝试了所有不同版本的子进程调用,有和没有shell=True. 我究竟做错了什么?是否可以在 gunicorn-flask 程序中运行子进程?

标签: pythonflashsubprocessgunicorn

解决方案


推荐阅读