Разное поведение при обычном и отладочном запуске в многопоточном Virtualbox - PullRequest
0 голосов
/ 27 июня 2018

Я сталкиваюсь со странной ошибкой при запуске сценария в режиме отладки PyCharm или в приложении Flask. Я сузил свой код до следующего

import virtualbox
import threading

class ThreadExecutor(threading.Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        vbox = virtualbox.VirtualBox()


if __name__ == '__main__':
    th = ThreadExecutor()
    th.start()

Запуск этого модуля в качестве модуля не приводит к ошибкам и прекрасно работает, но в режиме отладки выдает следующее сообщение об ошибке

Connected to pydev debugger (build 181.5087.37)
Exception in thread Thread-6:
Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\site-packages\vboxapi\__init__.py", line 449, in __init__
    None)
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:/Users/.../dev/debug.py", line 13, in run
    vbox = virtualbox.VirtualBox()
  File "C:\Program Files\Python36\lib\site-packages\virtualbox\library_ext\vbox.py", line 22, in __init__
    manager = virtualbox.Manager()
  File "C:\Program Files\Python36\lib\site-packages\virtualbox\__init__.py", line 143, in __init__
    self.manager = vboxapi.VirtualBoxManager(mtype, mparams)
  File "C:\Program Files\Python36\lib\site-packages\vboxapi\__init__.py", line 991, in __init__
    self.platform = PlatformMSCOM(dPlatformParams)
  File "C:\Program Files\Python36\lib\site-packages\vboxapi\__init__.py", line 455, in __init__
    print("Warning: CoInitializeSecurity failed: ", oXctp);
NameError: name 'oXctp' is not defined

Зайдя в \ vboxapi__init __. Py мы находим

try:
    pythoncom.CoInitializeSecurity(None,
                                   None,
                                   None,
                                   pythoncom.RPC_C_AUTHN_LEVEL_DEFAULT,
                                   pythoncom.RPC_C_IMP_LEVEL_IMPERSONATE,
                                   None,
                                   pythoncom.EOAC_NONE,
                                   None)
except:
    _, oXcpt, _ = sys.exc_info();
    if isinstance(oXcpt, pythoncom.com_error) and self.xcptGetStatus(oXcpt) == -2147417831: # RPC_E_TOO_LATE
        print("Warning: CoInitializeSecurity was already called");
    else:
        print("Warning: CoInitializeSecurity failed: ", oXctp);

Что вызывает эту ошибку? sys.exc_info() ведет себя иначе в потоке внутри отладчика?

1 Ответ

0 голосов
/ 07 июля 2018

Кажется, есть некоторые известные, нерешенные проблемы во взаимодействии между потоками и виртуальной коробкой, см. здесь . Я бы предложил вместо этого использовать многопроцессорность, поскольку у меня не было ни одной из предыдущих проблем с ним.

...