Запускать скрипты Python через дочерний процесс node.Js - PullRequest
0 голосов
/ 23 сентября 2019

Я работал на очень простом сервере node.Js с некоторыми маршрутами.Я попытался реализовать один маршрут, который сможет запускать скрипт python (3.6) при каждом его достижении, используя пакет Node Js child-process.Проблема заключается в следующем: когда я пытаюсь это сделать, запустив свой скрипт с правильными аргументами командной строки, ничего не происходит.

Я уже пытался выполнить простую команду, например, создание пустого файла или просто pwdвсе отлично работаетво-вторых, как вы можете видеть ниже, в моем скрипте на python я использую пакет logging python для отслеживания рабочего процесса.К сожалению, мой 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 logs:

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 (как, когда я тестировал вручную).С этим журналом я смогу узнать, что на самом деле происходит.

Спасибо, ребята, если вам нужна дополнительная информация о моей проблеме, пожалуйста, оставьте комментарий или вы можете свободно редактировать.

Среда: python3.6, узел v8.10.0 в экземпляре Ubuntu EC2.

1 Ответ

1 голос
/ 23 сентября 2019

Когда вы запускаете процесс с узлом, если вы хотите получить вывод stdio, вам нужно передать его как опцию, поэтому сделайте что-то вроде:

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

Проверьте: https://nodejs.org/api/child_process.html#child_process_options_stdio

...