簡體   English   中英

無法在節點中使用 child_process 捕獲 Docker 容器內的 python stdout

[英]Cannot capture python stdout inside Docker container using child_process in node

我有一個server.js文件,它使用child_process來調用python文件:

const express = require('express')
const app = express()
path = require('path');
fs = require('fs')

app.get('/call_script', function(req, res) {

  function_choice = req.query.function_choice   
  args_choice = req.query.args_choice

  // call python scripts
  var spawn = require("child_process").spawn;
  var process = spawn("python",["test.py", function_args]);

  process.stdout.on("data", function (data){
    from_python = data.toString("utf8");
    from_python = from_python.replace(/\n/g, " ").replace(/\\n/g, " "); 
    res.json({
       "answer" : from_python
    })

});

蟒蛇文件:

function_args = sys.argv[1]

# ..... retrieve function and arguments from function_args

result = locals()[function_choice](*arr_n)

print(result)
sys.stdout.flush()

如果我在終端中運行 node server.js,它會運行該文件並完美運行。 我可以使用帶有 Ajax 的 URL 調用快速端點。 調用 python 文件並正確返回輸出。 沒有問題。

如果我現在將 server.js 放入Docker容器中,則不會返回來自 python 的輸出。 沒有錯誤或崩潰,只是什么都沒有。 Ajax 調用只是掛起並且不返回任何內容。

Dockerfile 和 package.json 包含所有必要的命令和依賴項。 我可以運行容器,除了 python 輸出之外,一切正常。

我知道Docker/node 和 stdout存在問題,但我無法將 python 輸出輸出到容器之外。

如果我把console.log放在 process.stdout.on終端上,Docker日志什么也不顯示。

它與緩沖或刷新有關嗎?

編輯

這似乎與模塊不可用有關。 例如,未找到 matplotlib,但它會在 docker build 期間安裝。

這是我的Dockerfile

FROM node:9

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
COPY package*.json ./

RUN npm install

RUN apt-get update -y && \
    apt-get install -y python3 && \
    rm -rf /var/lib/apt/lists/*

RUN apt-get update -y
RUN apt-get -y install python3-pip

# Bundle app source
COPY . .

RUN pip3 install -r requirements.txt

EXPOSE 8899
CMD ["npm","start"]

這是我的requirements.txt

matplotlib

編輯2

pip3 show matplotlib

名稱:matplotlib

版本:2.1.1

位置:/usr/local/lib/python3.4/dist-packages

需要:numpy、6、python-dateutil、pytz、cycler、pyparsing

import sys, for p in sys.path: print(p)

/usr/lib/python3.4

/usr/lib/python3.4/plat-x86_64-linux-gnu

/usr/lib/python3.4/lib-dynload

/usr/local/lib/python3.4/dist-packages

/usr/lib/python3/dist-packages

tl; dr:在調用 python 可執行文件時添加-u選項。

如果我把 console.log 放在 process.stdout.on 終端上,Docker 日志什么也不顯示。
它與緩沖或刷新有關嗎?

是的,在我的測試期間,似乎當您使用默認節點 Docker 映像時,stdout 文件的緩沖存在一些問題,正如您在鏈接問題https://github.com/nodejs/docker- 中已經看到的那樣節點/問題/453

從 python 文檔中,這記錄在sys.stdout部分: https : sys.stdout

交互式時,stdout 和 stderr 流是行緩沖的。 否則,它們像常規文本文件一樣被塊緩沖。 您可以使用 -u 命令行選項覆蓋此值。

我通過使用附加-u選項調用 python 可執行文件解決了這個問題,該選項強制 stdout 和 stderr 流無緩沖( https://docs.python.org/3/using/cmdline.html#cmdoption-u

在您的情況下,以下內容可能會解決您的問題:

var process = spawn("python", ["-u", "test.py", function_args]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM