我正在Raspberry Pi和Rasbian Jessie上使用Flask + gunicorn + nginx开发一个简单的网站。 我坚持用这个Python代码启动一个进程:
def which(program):
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
path = path.strip('"')
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
mplayer_path = which("mplayer")
try:
player = subprocess.Popen([mplayer_path, mp3], stdin=subprocess.PIPE)
except:
return render_template('no_mp3s.html', mp3_message=sys.exc_info())
" mp3和#34;是" mplayer_path"是一个mp3文件的路径。是mplayer的绝对路径,由this answer中描述的 函数返回。
当我直接启动flask时,代码在开发中工作。在生产中,当我通过nginx访问网站时,我通过no_mp3s.html模板收到以下错误消息:
type' exceptions.AttributeError'
AttributeError("' NoneType'对象没有属性' rfind'",)
跟踪对象位于0x7612ab98
我怀疑nginx存在权限问题,但是对Linux很新,我有点迷失了!
编辑: 我应该在我的代码中添加它(适合单个文件)我调用rfind()。另外,我确信错误是在这个特定的try /中捕获的,因为它是唯一输出到no_mp3s.html的错误。
编辑: 根据blubberdiblub的评论,我发现当应用程序在nginx中运行时,哪个功能不起作用。硬编码mplayer的路径似乎有效!