Гнездо без имени модуля - PullRequest
3 голосов
/ 25 марта 2019

Я пытаюсь использовать модуль сокета в сценарии входа для SecureCRT.При запуске из моей командной строки скрипт работает отлично, но как только я пытаюсь запустить его через SecureCRT, он говорит, что нет модуля сокета.Я использую Python 3.7 и убедитесь, что сокет в моей библиотеке.Моя библиотека также сопоставлена ​​для пути.

Вот скрипт, который я запускаю:

import socket
import datetime
timeIn=(datetime.datetime.now().strftime('%d %B %Y %H:%M:%S'))
hostname = socket.gethostname()
hostip = socket.gethostbyname(hostname)
t=open("secCRT.txt", "w")
t.write('testing script \n')
t.write(timeIn)
t.write(' host: '+  hostname)
t.write(' ip: '+ hostip)
t.close()

При запуске из моей командной строки он работает отлично, но при запуске внутри crt он утверждает, что нетмодуль с именем socket (без модуля с именем _socket).Я видел, что есть похожие посты к этому, но ни один не смог мне помочь.

РЕДАКТИРОВАТЬ # 1

Вот как Python отображается на путисистемная переменная:

enter image description here

РЕДАКТИРОВАТЬ # 2

Попытка перемещения _socket.py и socket.py для версии3.7 в ту же директорию, что и скрипт, но все равно получаю ошибки. edit * также socket.cpython-37.pyc

EDIT # 3

Мне интересно, потому что это скрипт входа в систему (запускается присоединение установлено с сервером), может ли он искать модуль сокета на сервере, к которому я подключен, а не на локальной машине?Сам скрипт находится на локальном компьютере.

РЕДАКТИРОВАТЬ # 4 : из командной строки не сценарий входа в систему

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 'C:\\Program Files\\Python\\Python37\\python37.zip',
 'C:\\Program Files\\Python\\Python37\\DLLs',
 'C:\\Program Files\\Python\\Python37\\lib',
 'C:\\Program Files\\Python\\Python37',
 'C:\\Program Files\\Python\\Python37\\lib\\site-packages']

РЕДАКТИРОВАНИЕ # 5

Я смог сделать это как скрипт в приложении SecureCRT

with open("secCRT.txt", "w") as sout:
    sout.write(pprint.pformat(vars(pprint)))

Несколько строк ссылаются на этот файл:

C:\Program Files\VanDyke Software\Clients\vpython27.zip

Это заставляет меня поверить, что онииспользуете версию 2.7.Когда я искал внутри vpython27.zip «сокет», socket.pyc и SocketServer.pyc были единственными найденными предметами.Означает ли это, что я хотел бы найти socket.py или любые другие зависимости для версии 2.7 и переместить их туда?

EDIT # 6 : объяснение от разработчика (VanDyke)

"  - The _socket module is built out by default as a .pyd
    file on Windows. This is effectively a .dll that can be
    loaded by the Python interpreter. Unfortunately, .pyd's
    can *not* be loaded out of the Python distribution zip
    file we ship."

РЕДАКТИРОВАТЬ # 7 : вот как VanDyke предложил мне получить данные, которые я искал

objTab=crt.GetScriptTab()
objConfig=objTab.Session.Config
strHostname=objConfig.GetOption('Hostname')
strSessName=objTab.Session.Path

Это решение отлично подходит для моей среды.

1 Ответ

1 голос
/ 28 марта 2019

РАБОЧЕЕ РЕШЕНИЕ

VanDyke предложил использовать следующий код, чтобы получить имя хоста и имя сеанса с python, используемым в качестве сценария входа в систему.

objTab=crt.GetScriptTab()
objConfig=objTab.Session.Config
strHostname=objConfig.GetOption('Hostname')
strSessName=objTab.Session.Path
...