3

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 が path システム変数にマップされる方法は次のとおりです。

ここに画像の説明を入力

編集#2

バージョン 3.7 の _socket.py と socket.py をスクリプトと同じディレクトリに移動しようとしましたが、それでもエラーが発生します。edit*も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」で検索したら、socket.pycSocketServer.pycしか出てきませんでした。socket.pyこれは、バージョン 2.7 のまたはその他の依存関係を見つけてそこに移動したいということですか?

編集 #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

このソリューションは、私の環境ではうまく機能します。

4

1 に答える 1