Передача stdout kwarg в методе subprocess.check_call возвращает ошибку Apache / mod_wsgi в python 3 - PullRequest
0 голосов
/ 04 декабря 2018

Я перенаправляю 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.

Кто-нибудь может прояснить, что происходитздесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...