Я перенаправляю stdout
в файл при модульном тестировании в Django, чтобы не отображать вывод на экране.
Я сохраняю sys.stdout
в переменной и создаю if
вызвать subprocess.check_call
# if testing or running jenkins, redirects stdout to a temp file
if 'test' in sys.argv or 'jenkins' in sys.argv or 'runserver' in sys.argv:
outfile = tempfile.NamedTemporaryFile(suffix='.txt')
else:
outfile = sys.stdout
try:
subprocess.check_call(cmd, stdout=outfile)
except subprocess.CalledProcessError:
messages.error(request, DOWNLOAD_ERROR_MESSAGE)
return HttpResponseRedirect(
reverse('experiment-detail', kwargs={'slug': experiment.slug})
)
При запуске в localhost с помощью команды Django runserver
manage.py, при этом outfile = sys.stdout
, а затем subprocess.check_call(cmd, stdout= outfile)
правильно отображают вывод stdout
на экране, но как-токогда Django работает на Apache / mod_wsgi, Apache отказывается принимать sys.outfile
в качестве значения для аргумента stdout
.
Представленная ошибка:
Internal Server Error: /downloads/163/
Traceback (most recent call last):
File "/var/lib/nep-system/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/var/lib/nep-system/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _getresponse
response = self.process_exception_by_middleware(e, request)
File "/var/lib/nep-system/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _geresponse
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/lib/nep-system/portal/downloads/views.py", line 180, in download_view
compressed_file = remove_files(compressed_file, request, experiment)
File "/var/lib/nep-system/portal/downloads/views.py", line 155, in remove_files
subprocess.check_call(cmd, stdout=sys.stdout)
File "/usr/lib/python3.5/subprocess.py", line 266, in check_call
retcode = call(*popenargs, **kwargs)
File "/usr/lib/python3.5/subprocess.py", line 247, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib/python3.5/subprocess.py", line 640, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "/usr/lib/python3.5/subprocess.py", line 1135, in _get_handles
c2pwrite = stdout.fileno()
OSError: Apache/mod_wsgi log object is not associated with a file descriptor.
Кто-нибудь может прояснить, что происходитздесь