フォームを表示し、添付ファイルとしてブラウザーに返される pdflatex を使用して PDF ファイルを生成するアプリケーションがあります。アプリケーションサーバーを手動で呼び出すと機能しますが、サーバープロセスが Supervisord によって開始されると壊れます...
Django は OSError をスローします:
[Errno 2] No such file or directory
Request Method: POST
Request URL: http://apps.xxxxxxxx.com/pdf/view/1/85/
Django Version: 1.4.5
Exception Type: OSError
Exception Value:
[Errno 2] No such file or directory
Exception Location: /usr/lib/python2.7/subprocess.py in _execute_child, line 1249
Python Executable: /home/ubuntu/Envs/venv/bin/python
Python Version: 2.7.3
エラーは次の行によってスローされます。subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb'))
完全なトレースバック:
Traceback:
File "/home/ubuntu/Envs/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/home/ubuntu/CURRENT/project/appname/apps/catpdf/views.py" in render_preview
114. subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb'))
File "/usr/lib/python2.7/subprocess.py" in call
493. return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py" in __init__
679. errread, errwrite)
File "/usr/lib/python2.7/subprocess.py" in _execute_child
1249. raise child_exception
Exception Type: OSError at /pdf/view/1/85/
Exception Value: [Errno 2] No such file or directory
Django dev サーバーを使用してアプリケーションをテストしたり、gunicorn wsgi:app を使用してコマンド ラインから Gunicorn を呼び出したりしたときに、ファイルが正常に返されたため、これは珍しいことです。サーバーは常に nginx の背後にあります。
エラーをスローしているコードのセクション (subprocess.call 行) は次のとおりです。
output = t.render(cont)
oname = ''.join([slugify(context['qb_full_name']), datetime.datetime.now().strftime("%Y%m%d_%H%M")])
out_f = open(''.join([os.path.join(rnddir, oname), '.tex']), "w")
out_f.write(output.encode('utf-8'))
out_f.close()
#jname = ''.join(['-jobname=', oname])
proc_string = ' '.join(['pdflatex', '-output-directory', rnddir, os.path.abspath(out_f.name)])
subprocess.call(shlex.split(proc_string), stdout=open(os.devnull, 'wb'))
fname = os.path.join(rnddir, ''.join([oname, '.pdf']))
pdf = open(fname, 'r')
for s in signatures:
os.unlink(s)
response = http.HttpResponse(FixedFileWrapper(pdf), content_type=mimetypes.guess_type(fname)[0])
response['Content-Disposition'] = 'attachment; filename="%s"' % os.path.basename(fname)
response['Content-Length'] = os.path.getsize(fname)
return response
django デバッグからのローカル変数:
out_f
<closed file u'/home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered/customer-name20130509_1541.tex', mode 'w' at 0x4211780>
signatures
['/home/ubuntu/CURRENT/project/appname/apps/catpdf/tmp/tmpyJrUYO.pdf',
'/home/ubuntu/CURRENT/project/appname/apps/catpdf/tmp/tmpLGMaRT.pdf']
rnddir
'/home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered'
proc_string
u'pdflatex -output-directory /home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered /home/ubuntu/CURRENT/project/appname/apps/catpdf/rendered/customer-name20130509_1541.tex'
スーパーバイザー構成:
[program:gunicorn]
directory=%(ENV_HOME)s/CURRENT/project
user=ubuntu
command=gunicorn --preload wsgi:appname
environment=PATH="/home/ubuntu/Envs/venv/bin"
stdout_logfile = %(ENV_HOME)s/CURRENT/logs/guni-access.log
stderr_logfile = %(ENV_HOME)s/CURRENT/logs/guni-error.log
autostart=True
autorestart=True
priority=997