Окно CEFPython закрывается без предупреждения при передаче больших данных - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь создать эту привязку Python к создаваемому мною приложению Electronjs, где часть Python используется для анализа данных, а результат (словарь Python) передается в веб-браузер для визуализации. Все это работало как прелесть для небольшого количества данных, но когда я попытался передать большой словарь результатов (~ 200 МБ), окно было создано, но закрыто без предупреждения в терминале (я не смог проверить devtool), хотя похоже, что подпроцесс продолжает работать на сервере. Эта проблема возникла как на компьютерах с Windows, так и на компьютерах с Ubuntu, и я очень признателен за вашу помощь.

вот мой код:

def view(data):

config = data

settings = {
    "debug": True,
    "log_severity": cef.LOGSEVERITY_INFO,
    "log_file": "debug.log",
}
cef.Initialize(settings=settings)
browser_setting = { "file_access_from_file_urls_allowed":True,\
                "universal_access_from_file_urls_allowed": True,\
                "web_security_disabled":True}
browser = cef.CreateBrowserSync(url='file://' + os.path.realpath("index_cefpython.html"),
                                window_title="Javascript Bindings", settings = browser_setting)
browser.SetClientHandler(LoadHandler(config))
bindings = cef.JavascriptBindings()
browser.SetJavascriptBindings(bindings)
cef.MessageLoop()
del browser
cef.Shutdown()

return 


class LoadHandler(object):

def __init__(self, config):
    self.config = config
def OnLoadEnd(self, browser, **_):
    browser.ExecuteFunction("defineData", self.config)

на стороне JS, у меня есть:

<script type="text/javascript">
    function defineData(datainput){             

    console.log("start")
    data = datainput;

    Main();
    }
</script>

и вот все сообщения, распечатанные в терминале:

[0312 / 104311.439: INFO: cefpython_app.cpp (199)] [Процесс браузера] OnBeforeChildProcessLaunch () командная строка: "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess" --type = gpu-process --no-sandbox --locales-dir-path = "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales" --log-file = debug.log --log-severity = информация --resources-dir -path = "<> \ Anaconda3 \ lib \ site-packages \ cefpython3" --lang = en-US --disable-gpu-shader-disk-cache / prefetch: 2

[0312 / 104311.440: INFO: cef_log.cpp (8)] [Процесс браузера] Переключатель уже установлен, игнорируя: disable-gpu-shader-disk-cache

[0312 / 104311.440: INFO: cefpython_app.cpp (199)] [Процесс браузера] OnBeforeChildProcessLaunch () командная строка: "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess" --type = gpu-process --no-sandbox --locales-dir-path = "C: \ Users \ Xiangyun \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales" --log-file = debug.log --log-severity = info - -ресурсы-Dir-путь =»<> \ Anaconda3 \ Lib \ сайт-пакеты \ cefpython3" --lang = EN-US повреждает-ГП-шейдер-кэширование диска --gpu-предпочтение = KAAAAAAAAACAA4CAAQAAAAAAAAAAAGAAEAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAIAAAAAAAAAAoAAAAAAAAADAAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAKAAAAEAAAAAAAAAAAAAAACwAAABAAAAAAAAAAAQAAAAoAAAAQAAAAAAAAAAEAAAALAAAA --locales- dir-path = "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales" --log-file = debug.log --log-severity = info --resources-dir-path = "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 "--lang = en-US / prefetch: 2

[0312 / 104311.473: INFO: cef_log.cpp (8)] [Процесс браузера] CreateBrowserSync () с именем

DevTools прослушивает ws: //127.0.0.1: 59232 / devtools / browser / abaff316-3b5c-4647-8af3-c7c521146d08 [0312 / 104311.473: INFO: cef_log.cpp (8)] [Процесс браузера] navigateUrl: file: ///// <> /index_cefpython.html

[0312 / 104311.475: INFO: cef_log.cpp (8)] [Процесс браузера] CefBrowser :: CreateBrowserSync ()

[0312 / 104311.493: INFO: cef_log.cpp (8)] [Процесс браузера] GetPyBrowser (): создать новый PyBrowser, browserId = 1

[0312 / 104311.516: INFO: cefpython_app.cpp (199)] [Процесс браузера] OnBeforeChildProcessLaunch () командная строка: "<> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ subprocess" --type = renderer - no-sandbox --service-pipe-token = C31AF08C64F1883299C21D068EF5263C --lang = en-US --locales-dir-path = <> \ Anaconda3 \ lib \ site-packages \ cefpython3 \ locales "--log-file = debug. log --log-severity = info --resources-dir-path = "<> \ Anaconda3 \ lib \ site-packages \ cefpython3" --disable-gpu-shader-disk-cache / prefetch: 1

[0312 / 104311.528: INFO: cef_log.cpp (8)] [Процесс браузера] GetPyFrame (): базовый фрейм еще не существует: browserId = 1, frameId = -4

[0312 / 104311.529: INFO: cef_log.cpp (8)] [Процесс браузера] GetPyFrame (): базовый фрейм еще не существует: browserId = 1, frameId = -4

[0312 / 104311.531: INFO: cef_log.cpp (8)] [Процесс браузера] CefBrowser :: CreateBrowserSync () завершился успешно

[0312 / 104311.532: INFO: cef_log.cpp (8)] [Процесс браузера] Дескриптор окна CefBrowser = 595526

[0312 / 104311.533: INFO: cef_log.cpp (8)] [Процесс браузера] GetPyFrame (): базовый фрейм еще не существует: browserId = 1, frameId = -4

[0312 / 104311.534: INFO: cef_log.cpp (8)] [Процесс браузера] SendProcessMessage (): message = DoJavascriptBindings, размер аргументов = 1

[0312 / 104311.534: INFO: cef_log.cpp (8)] [Процесс браузера] MessageLoop ()

[0312 / 104311.612: INFO: client_handler.cpp (40)] [Процесс браузера] OnProcessMessageReceived (): OnContextCreated

[0312 / 104311.613: INFO: cef_log.cpp (8)] [Процесс браузера] V8ContextHandler_OnContextCreated ()

[0312 / 104311.614: INFO: cef_log.cpp (8)] [Процесс браузера] GetPyFrame (): создать новый PyFrame, frameId = 2

1 Ответ

0 голосов
/ 12 марта 2019

Привязка Javascript не должна использоваться для передачи больших данных.Для отправки больших данных используйте http запросы.В основном либо используйте запросы AJAX и запускайте внутренний веб-сервер в приложении, либо используйте Resource Handler, который позволяет обрабатывать запросы без запуска веб-сервера.

См. Учебный документ> «Интеграция Javascript»> «Связь с использованием запросов http"раздел (прокрутите немного вниз после нажатия на ссылку):

https://github.com/cztomczak/cefpython/blob/master/docs/Tutorial.md#javascript-integration

Вы можете попытаться отправить данные небольшими частями, используя привязки javacript, но использование запросов будет более эффективным.

Проверьте, как увеличивается объем памяти вашего приложения при отправке данных.Используйте монитор процессов в Linux и диспетчер процессов в Windows.

Чтобы выяснить, что не удалось при отправке 200 МБ данных, отладьте приложение, чтобы получить трассировку стека.Если вы используете Linux, тогда загрузите libcef.so с символами отладки со страницы релизов, помеченной, например, v66-upstream.Замените оригинальный libcef.so в пакете cefpython3 на этот.Команды GDB можно найти здесь:

https://github.com/cztomczak/cefpython/blob/master/docs/Knowledge-Base.md#python-crashes-with-segmentation-fault---how-to-debug

...