首页 > 解决方案 > Paramiko SSHClient 将无法连接使用 Pyinstaller 构建的可执行文件

问题描述

编辑

问题已解决,但前提是我从桌面运行生成的可执行文件,而不是我一直在开发和运行的服务器位置(VPN)。无需更改代码,但我希望有更健壮的东西。从网络位置运行时,这没有理由不起作用,特别是考虑到如果我在不创建可执行文件的情况下运行脚本,它就可以正常工作。似乎在那里运行它而不是在我的计算机桌面上运行它所带来的迟缓是导致事情表现不同的原因。我真的很想知道为什么会这样,以及是否有办法避免它。


版本:

以下是显示该问题的代码的最小版本:

import paramiko

ip = "10.0.0.172"
username = "username"
password = "password"

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip, username=username, password=password)

stdin, stdout, stderr = client.exec_command("ls")
print(stdout.readlines())

client.close()

pipenv用来在虚拟环境中包含这些包。

本地运行时(例如pipenv run python main.py),没有问题。运行由 Pyinstaller 生成的可执行文件,使用pipenv run pyinstaller Test.spec --distpath "./Release",在运行生成的可执行文件时会导致以下运行时错误:

Traceback (most recent call last):
File "main.py", line 8, in <module>
File "lib\site-packages\paramiko\client.py", line 343, in connect
File "socket.py", line 231, in __init__
OSError: [WinError 10022] An invalid argument was supplied

我尝试过的事情:

这是我的 .spec 文件:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['main.py'],
    binaries=[],
    datas=[],
    hiddenimports=["_socket"],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False
)
         
pyz = PYZ(
    a.pure,
    a.zipped_data,
    cipher=block_cipher
)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='Test',
    debug=True,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True
)

coll = COLLECT(exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='Test'
)

感谢您的帮助。

标签: pythonsocketspyinstallerparamiko

解决方案


推荐阅读