获取在Django+rpy2中产生未定义行为的请求(***检测到堆栈破坏***:终止)

2024-06-26 14:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django中使用rpy2时看到一些奇怪的行为

rfn.py:

from rpy2.robjects import r as R
import rpy2.robjects as robjects
import json
from .models import TestModel

# 4-5 various R functions
R('''
 library(someLib)
 someFunc <- function() {

 }
''')

class SpectraScores():
  def __init__(self, form):
    pass
  # A number of other function which when commented out 
  # do not change the error being produced.
  # E.g.,
  def init():
    pass

views.py:

from .rfn import SpectraScores
def view_cosine(request):
  if request.method == 'POST':
    form = ViewCosineForm(request.POST, request.FILES)
    if form.is_valid():
      sc = SpectraScores(form).info()
      return render(
        request,
        'chat/view_cosine.html',
        {'form': form, 'sc': sc}
      )
  else:
    form = ViewCosineForm()
  return render(request, 'chat/view_cosine.html', {'form': form})

forms.py:

from .models import TestModel
class ViewCosineForm(forms.Form):
  '''
  Select any spectra from lab, library, metadata
  '''
  sid = forms.ModelMultipleChoiceField(
    queryset = TestModel.objects.all(),
    to_field_name = "test",
    required = False
  )

从shell运行并打开对“/cosine/”的GET(??)请求会产生以下结果:

$ ./manage.py runserver

[16/Feb/2021 23:32:08] "GET /cosine/ HTTP/1.1" 200 9083
[16/Feb/2021 23:32:08] "GET /static/js/jquery-3.3.1.min.js HTTP/1.1" 304 0
[16/Feb/2021 23:32:08] "GET /static/js/d3.min.js HTTP/1.1" 304 0
[16/Feb/2021 23:32:08] "GET /static/js/bootstrap.bundle.js HTTP/1.1" 304 0
Not Found: /favicon.ico
R[write to console]: Error: ignoring SIGPIPE signal
R[write to console]: Fatal error: unable to initialize the JIT
*** stack smashing detected ***: terminated

此时Django./manage.py runserver退出

然后,在发生此错误后,跳回命令提示符并重新启动Django(./manage.py runserver)会导致另一个错误立即发生,导致启动过程崩溃!每次(一行中一次或多次)都会发生此错误,或者根本不会发生此错误:

(venv) [dave@localhost maldidb]$ ./manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib64/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
    self.check(display_num_errors=True)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/core/management/base.py", line 392, in check
    all_issues = checks.run_checks(
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/core/checks/registry.py", line 70, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/core/checks/urls.py", line 23, in check_resolver
    return check_method()
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 408, in check
    for pattern in self.url_patterns:
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 589, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 582, in urlconf_module
    return import_module(self.urlconf_name)
  File "/home/dave/Dev/maldi-django/venv/lib64/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/dave/Dev/maldi-django/maldidb/soMedia/urls.py", line 9, in <module>
    path('', include('chat.urls')),
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/django/urls/conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
  File "/home/dave/Dev/maldi-django/venv/lib64/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/dave/Dev/maldi-django/maldidb/chat/urls.py", line 3, in <module>
    from . import views
  File "/home/dave/Dev/maldi-django/maldidb/chat/views.py", line 55, in <module>
    from rpy2.robjects import r as R
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/rpy2/robjects/__init__.py", line 19, in <module>
    from rpy2.robjects.robject import RObjectMixin, RObject
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/rpy2/robjects/robject.py", line 10, in <module>
    rpy2.rinterface.initr_simple()
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/rpy2/rinterface.py", line 859, in initr_simple
    _post_initr_setup()
  File "/home/dave/Dev/maldi-django/venv/lib/python3.8/site-packages/rpy2/rinterface.py", line 940, in _post_initr_setup
    signal.signal(signal.SIGINT, _sigint_handler)
  File "/usr/lib64/python3.8/signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread

应该注意的是,views.py中正在以以下decorator(@start_new_thread)的形式进行线程处理,但是在上面的请求中没有发生线程处理。相反,线程是为某些其他视图保留的,这些视图在上述上下文中没有执行

同样,从views.py:

def start_new_thread(function):
  '''Starts a new thread for long-running tasks'''
  def decorator(*args, **kwargs):
    t = Thread(target = function, args = args, kwargs = kwargs)
    t.daemon = True
    t.start()
    return t
  return decorator

最后,信号?可能不相关,但有一些地方考虑了使用信号的代码,例如:

@receiver(post_save, sender=User)
def create_profile(sender, **kwargs):
  ...

然而,注释掉所有提到的接收器和导入到Django信号(例如from django.db.models.signals import post_save)仍然不会影响不稳定的行为

编辑: 经过一定程度的简化后,当对rpy2的唯一引用是以下引用时,仍然会出现错误:

views.py

from rpy2.robjects import r as R

由于代码中没有其他对R或rpy2的引用,错误仍然会发生!要清楚,删除这一行会导致上述错误停止

可能是本地R环境中的错误


Tags: djangoinpydevimporthomevenvlib