我有一个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
})
});python文件:
function_args = sys.argv[1]
# ..... retrieve function and arguments from function_args
result = locals()[function_choice](*arr_n)
print(result)
sys.stdout.flush()如果我在终端中运行节点server.js,它将运行该文件,而完全可以运行。我可以使用带有Ajax的URL调用express端点。python文件将被调用并正确返回输出。没问题。
如果我现在将server.js放置到Docker容器中,则不会返回python的输出。没有错误或崩溃,只是什么都没有。Ajax调用只是挂起,什么也不返回。
Dockerfile和package.json包含所有必要的命令和依赖项。除了python输出之外,我可以运行所有可以工作的容器。
我知道有带有问题的、Docker/node和stdout,但是我没有能够将输出放到容器之外。
如果我把console.log 放在process.stdout.on中,终端和Docker 日志就不会显示任何信息。
这跟缓冲还是冲水有关?
编辑
它似乎与模块不可用有关。例如,没有找到matplotlib,但是它在docker构建期间安装。
这是我的文档
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
matplotlibEDIT2
pip3 show matplotlib名称: matplotlib
版本: 2.1.1
位置:/usr/local/lib/python3.4/dist-包
需要: numpy,6,,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-包
/usr/lib/python3 3/dist-包
发布于 2020-07-31 10:30:51
tl;dr:在调用-u可执行文件时添加-u选项。
如果我将console.log放在process.stdout.on中,终端和Docker日志就什么都不会显示。 这跟缓冲还是冲水有关?
是的,在我的测试中,当您使用默认的节点Docker映像时,似乎在stdout文件的缓冲方面存在一些问题,就像您在链接问题https://github.com/nodejs/docker-node/issues/453中已经看到的那样。
从python文档中可以看出,这在sys.stdout部分:https://docs.python.org/3/library/sys.html#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]);https://stackoverflow.com/questions/48069045
复制相似问题