当前,我在具有两个buildpack(NodeJS和Python)的Heroku dyno上运行了功能良好的NodeJS Web应用程序,这应该允许我同时在JS和Python中运行脚本。
我有一个Python脚本,希望在Heroku dyno的virtualenv中执行。下面是有关如何执行此操作的概述。
以下Javascript函数将启动start.py。
spawnPythonProcess(`${__dirname}/start.py`).then((data) => {
console.log(data.toString());
}).catch((err) => {
console.log(err.toString());
})
start.py在virtualenv中运行我的python脚本。
import subprocess
import os
curr_dirname = os.path.dirname(os.path.abspath(__file__))
python_bin = curr_dirname + '/ENV/bin/python3.7'
script_file = curr_dirname + '/ipos.py'
subprocess.Popen([python_bin, script_file])
不幸的是,我在Heroku托管的应用程序的日志中遇到以下错误。
我是否收到此错误,是因为我的virtualenv(我在Mac上启动的)没有与Heroku服务器(我假设正在运行Linux)一起玩?如果有人可以比我的猜测更清楚地解释该错误,将不胜感激。
Traceback (most recent call last):
File "/app/api/helpers/ipos/start.py", line 13, in <module>
subprocess.Popen([python_bin, script_file])
File "/app/.heroku/python/lib/python3.7/subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "/app/.heroku/python/lib/python3.7/subprocess.py", line 1499, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/app/api/helpers/ipos/ENV/bin/python3.7'
Traceback (most recent call last):
File "/app/api/helpers/ipos/start.py", line 13, in <module>
subprocess.Popen([python_bin, script_file])
File "/app/.heroku/python/lib/python3.7/subprocess.py", line 756, in __init__
restore_signals, start_new_session)
File "/app/.heroku/python/lib/python3.7/subprocess.py", line 1499, in _execute_child
我还尝试为此post在每个Python文件中添加#!/usr/bin/env python
,但是我认为我的问题不一样。
对于某些情况,我认为对于要在Web应用程序中运行的每个Python脚本都有一个单独的virtualenv是一个好主意,而不是将我的所有依赖项都保留在requirements.txt中以保持依赖项在本地每个脚本。也欢迎对为什么这不是一个好主意的任何评论以及关于如何改进此方法的建议。总体思路是,我有一个NodeJS Web应用程序,该应用程序需要定期运行一些Python脚本。