我一直在与一些路线非常简单node.Js服务器上。我试图执行一个路由,将能够运行一个python(3.6)脚本每次都达到使用Node Js child-process package。问题是:当我尝试这样做,我运行脚本用正确的命令行参数,什么都不会发生。

我已经尝试过像创建一个空文件,或只是一个简单的pwd一切工作正常运行一个简单的命令。其次,你可以看到下面,我python脚本,我使用的是logging python package保持工作流的痕迹。不幸的是,我的logfile.log是空的。我也试图让流从python背部和打印标准输出:没有。该脚本路径是正确的,所以我真的不知道我的剧本和node.js中的手动执行之间有什么区别。

Node.Js代码:

app.get('/trigger',(req, res) => {
        console.log('/trigger');
        console.log(__dirname + "/../scripts/launcher.py")
        var key = req.query['Key'];
        const spawn = require('child_process').spawn;
        const pythonProcess = spawn("python3.6", [__dirname + "/../scripts/launcher.py", key]);
        console.log("process started with pid : " + pythonProcess.pid);
        pythonProcess.stdout.on('data', (data) => {
                console.log("child stdout")
                console.log(`\n${data}`);
        });
        res.status(200).send()
})

Python代码:


def init_logger():
    # create logger with 'spam_application'
    logger = logging.getLogger('spam_application')
    logger.setLevel(logging.DEBUG)

    # Load variable to env
    load_dotenv()

    # create file handler which logs even debug messages
    fh = logging.FileHandler(dir_path + '/logfile.log')
    fh.setLevel(logging.DEBUG)

    # create formatter
    formatter = logging.Formatter("%(asctime)s; %(levelname)s ; %(message)s",
                                  "%d-%m-%Y %H:%M:%S ")
    fh.setFormatter(formatter)  # add formatter to ch
    logger.addHandler(fh)  # add ch to logger
    return logger


def main():
    logger = init_logger()
    logger.info("logfile has been updated :D")

    # Downloading mail before processing it
    raw_mail = fetch_mail(sys.argv[1])
    mailer = MailManager(logger)
    if mailer.entry_point(raw_mail) == -1:
        logger.error("Sender Not Authorized")
        return -1
    uploader = Uploader(logger)
    uploader.initialize_warning_count()
    result = mailer.get_mailobj()
    uploader.entry_point(result)
    return 0

最后Node.js PM2日志:

0|| 2019-09-23T12:29:55: /trigger
0|| 2019-09-23T12:29:55: my/path/to/script/launcher.py
0|| 2019-09-23T12:29:55: process started with pid : 19068

所以我有一个PID,这意味着该命令运行良好(我不知道)。我希望能有python的日志里面LOGFILE.LOG(当我手动测试)。与这个日志我就能知道发生了什么realyy回事。

谢谢你们,如果您需要了解我的问题的详细信息,请发表评论或可自由编辑。

环境:python3.6,在Ubuntu EC2实例节点v8.10.0。

分析解答

当你生成一个进程使用节点,如果你想获得你需要把它作为一个选项,因此像做标准输入输出输出:

const pythonProcess = spawn("python3.6", [__dirname + "/../scripts/launcher.py", key], { stdio: 'inherit' });

校验: https://nodejs.org/api/child_process.html#child_process_options_stdio