通过node.Js子进程运行Python脚本

通过node.Js子进程运行Python脚本,python,node.js,amazon-web-services,child-process,Python,Node.js,Amazon Web Services,Child Process,我一直在开发一个非常简单的node.Js服务器,其中包含一些路由。我尝试实现一个路由,每次到达它时都可以运行python(3.6)脚本,使用节点Js子进程包。问题是:当我尝试这样做时,使用正确的命令行args运行我的脚本,什么都没有发生 我已经试过运行一个简单的命令,比如创建一个空文件,或者只是一个简单的pwd一切正常。其次,正如您在下面看到的,在我的python脚本中,我使用日志记录python包来跟踪工作流。不幸的是,我的logfile.log是空的。我还尝试从python中获取流并在标准输

我一直在开发一个非常简单的node.Js服务器,其中包含一些路由。我尝试实现一个路由,每次到达它时都可以运行python(3.6)脚本,使用节点Js
子进程
包。问题是:当我尝试这样做时,使用正确的命令行args运行我的脚本,什么都没有发生

我已经试过运行一个简单的命令,比如创建一个空文件,或者只是一个简单的
pwd
一切正常。其次,正如您在下面看到的,在我的python脚本中,我使用
日志记录
python包来跟踪工作流。不幸的是,我的
logfile.log
是空的。我还尝试从python中获取流并在标准输出中打印:nothing。脚本的路径是正确的,所以我不知道手动执行脚本和node.js之间有什么区别

Node.Js代码:

app.get('/trigger',(req,res)=>{
log('/trigger');
console.log(uu dirname+“/../scripts/launcher.py”)
var key=req.query['key'];
const spawn=require('child_process')。spawn;
const pythonProcess=spawn(“python3.6”[\uu dirname+“/../scripts/launcher.py”,key]);
log(“进程以pid启动:+pythonProcess.pid”);
pythonProcess.stdout.on('data',(data)=>{
console.log(“子标准输出”)
log(`\n${data}`);
});
res.status(200).send()
})
Python代码:


def init_logger():
#使用“垃圾邮件应用程序”创建记录器
logger=logging.getLogger('spam\u应用程序')
logger.setLevel(logging.DEBUG)
#将变量加载到env
加载_dotenv()
#创建甚至记录调试消息的文件处理程序
fh=logging.FileHandler(dir_path+'/logfile.log')
fh.setLevel(记录.调试)
#创建格式化程序
formatter=logging.formatter(“%(asctime)s;%(levelname)s;%(message)s”,
%d-%m-%Y%H:%m:%S)
fh.setFormatter(格式化程序)#将格式化程序添加到ch
logger.addHandler(fh)#将ch添加到logger
返回记录器
def main():
logger=init_logger()
logger.info(“日志文件已更新:D”)
#在处理邮件之前下载邮件
原始邮件=获取邮件(sys.argv[1])
mailer=MailManager(记录器)
如果邮件输入点(原始邮件)=-1:
记录器错误(“发送方未授权”)
返回-1
上传器=上传器(记录器)
上载程序。初始化\u警告\u计数()
结果=mailer.get_mailobj()
上传器入口点(结果)
返回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中(就像我手动测试时一样)。有了这个日志,我就能知道到底发生了什么

谢谢各位,如果你们需要更多关于我的问题的信息,请发表评论或自由编辑


环境:python3.6,Ubuntu EC2实例中的node v8.10.0。

当您使用node生成一个进程时,如果您想要获得stdio输出,您需要将其作为一个选项传递,因此请执行以下操作:

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

标记为answer,它允许我看到Python直接引发异常。顺便说一句,我的问题来自于manual和node js环境变量不同的事实<节点中不存在code>PYTHONPATH
,因此myLauncher.py中的python导入无法工作。它还停止阻止python更新logfile.log!谢谢