[英]child_process spawnSync iterate python stdout results using for loop
[英]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.