Почему моя DLL не подключается к серверу данных через Jupyter Notebook, а подключается с помощью файла .py через Anaconda Prompt? - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь подключиться к серверу для сбора данных, используя Python через DLL (скомпилировано для Windows 32 бит).

Когда я запускаю свой код с помощью Anaconda Prompt в среде Я создал (python 3.7 и 32-битная версия) с "python my_code.py", он отлично работает и может подключиться к серверу, и я вижу правильное сообщение из функции обратного вызова.

Но когда Я пытаюсь запустить код из файла .ipynb внутри Jupyter Notebook в той же среде, в которой он не может подключиться к серверу, потому что он продолжает получать nResult = "1" (что означает "Соединение") с сервера и никогда не получает nResult = «4» (что означает «Подключено»).

Что может происходить? Как я могу проверить вещи, чтобы понять, что происходит с сокетом? Это может быть проблема с портом сокета или конфигурацией ядра от Jupyter Notebook? Я хочу продолжать работать с ноутбуком Jupyter и получать сообщения от функций обратного вызова после подключения к серверу.

Мой код выглядит следующим образом:

import ctypes
from ctypes import *
import time

def CallBack1(nConnStateType, nResult):
    print('--CallBack1--')
    print('nConnStateType: %s' %nConnStateType)
    print('nResult: %s' %nResult)
    #nConnStateType: 2 = the server I want to connect.
    #nResult: Disconnected = 0, Connecting = 1, ConnectedWaiting = 2, ConnectedNotLogged = 3, ConnectedLogged = 4
    return

CallBack1_type = WINFUNCTYPE(c_void_p, c_int, c_int)
CallBack1_func = CallBack1_type(CallBack1)

#I will skip the others callback functions declarations for now because the only
#important function for this problem is the CallBack1 that shows the connection from the server.
#I need to receive nConnStateType: 2 and nResult: 4 to connect successfully.

...

myDLL = ctypes.WinDLL("myDLL.dll")
myDLL.Initialize.argtypes = [c_wchar_p, CallBack1_type, CallBack2_type, CallBack3_type, 
                             CallBack4_type, CallBack5_type, CallBack6_type]
myDLL.Initialize.restype = c_short

key_str = '12345'

c = myDLL.Initialize(key_str, CallBack1_func, CallBack2_func, CallBack3_func,
                           CallBack4_func, CallBack5_func, CallBack6_func)
print(c)
while True:
    time.sleep(2)
    print('Waiting information from the server...')

Мой вывод из использования " python my_code.py "из приглашения Anaconda в среде, которую я создал с python 3,7 и 32-битной (помните, что nConnStateType: 2 и nResult: 4 означает, что соединение успешно установлено):

0
--CallBack1--
nConnStateType: 2
nResult: 1
--CallBack1--
nConnStateType: 3
nResult: 0
--CallBack1--
nConnStateType: 2
nResult: 2
--CallBack1--
nConnStateType: 2
nResult: 4
Waiting information from the server...
Waiting information from the server...
Waiting information from the server...
...

Моя попытка вывода использовать ту же среду в Jupyter Notebook (он продолжает получать nConnStateType: 2 и nResult: 1 и не подключаться):

0
--CallBack1--
nConnStateType: 2
nResult: 1
--CallBack1--
nConnStateType: 2
nResult: 1
--CallBack1--
nConnStateType: 2
nResult: 1
Waiting information from the server...
--CallBack1--
nConnStateType: 2
nResult: 1
--CallBack1--
nConnStateType: 2
nResult: 1
Waiting information from the server...
--CallBack1--
nConnStateType: 3
nResult: 0
--CallBack1--
nConnStateType: 2
nResult: 1
Waiting information from the server...

Я застрял с этой проблемой уже несколько дней, попробовал LOT различных вещей (например, изменение кодировки для строки [я думал, что это была проблема с c_wchar_p, потому что функция ожидает wchar_t *]) без успеха. Фактически единственным успехом было то, что я обнаружил, что из подсказки Anaconda, использующей «python my_code.py», он работает и подключается, а не внутри Jupyter Notebook. Я не знаю, что еще искать, чтобы решить мою проблему, поэтому ЛЮБОЙ свет по этой проблеме действительно поможет. Большое спасибо.

...