没有名为插座的模块

时间:2019-03-25 19:41:36

标签: python-3.x python-2.7 secure-crt

我正在尝试在登录脚本中将套接字模块用于SecureCRT。从命令行运行时,脚本可以完美运行,但是一旦我尝试通过SecureCRT运行脚本,它就会告诉我没有套接字模块。 我正在使用python 3.7并确保套接字在我的lib中。我的库也被映射为路径。

这是我正在运行的脚本:

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

试图将版本3.7的_socket.py和socket.py移至与脚本相同的目录,但仍然出现错误。 编辑* 也是socket.cpython-37.pyc

编辑#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.pycSocketServer.pyc出现。 这是否意味着我想为版本2.7找到一个socket.py或任何其他依赖项并将它们移到那里?

编辑#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 个答案:

答案 0 :(得分:1)

工作解决方案

VanDyke建议我使用以下代码来获取主机名和会话名称,并将python用作登录脚本。

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