首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在节点中使用child_process捕获Docker容器中的python

无法在节点中使用child_process捕获Docker容器中的python
EN

Stack Overflow用户
提问于 2018-01-02 23:04:49
回答 1查看 880关注 0票数 0

我有一个server.js文件,它使用child_process来调用python文件:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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构建期间安装。

这是我的文档

代码语言:javascript
复制
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

代码语言:javascript
复制
matplotlib

EDIT2

代码语言:javascript
复制
pip3 show matplotlib

名称: matplotlib

版本: 2.1.1

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

需要: numpy,6,,pytz,cycler,pyparsing

代码语言:javascript
复制
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-包

EN

回答 1

Stack Overflow用户

发布于 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)。

就您的情况而言,以下可能会解决您的问题:

代码语言:javascript
复制
var process = spawn("python", ["-u", "test.py", function_args]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48069045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档