Paramiko SSHClient无法连接使用Pyinstaller构建的可执行文件

时间:2020-07-02 19:08:54

标签: python sockets pyinstaller paramiko

编辑

此问题已解决,但仅当我从桌面运行生成的可执行文件,而不是从(VPN)开发和运行的服务器位置运行时。无需更改代码,但我希望拥有更强大的功能。从网络位置运行时,没有理由不应该这样做,尤其是考虑到如果我在不创建可执行文件的情况下运行脚本,则可以正常工作。好像在那儿运行而不是在我的计算机桌面上运行一样迟钝,这是在某种程度上导致事情表现有所不同。我真的很想知道为什么会这样,是否有办法避免这种情况。


版本:

  • Windows 10
  • Python:3.8.3
  • PyInstaller:3.6
  • Paramiko:2.7.1

下面是显示该问题的代码的最低版本:

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)时,没有问题。使用pipenv run pyinstaller Test.spec --distpath "./Release"运行Pyinstaller生成的可执行文件时,在运行生成的可执行文件时会导致以下运行时错误:

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文件的hiddenimports中添加“ _socket”和“ socket”
  • 安装不同版本的Python,Pyinstaller,Paramiko
  • 正在搜索与此问题有关的其他人。我找到的最接近的是This Github Issue,其中提到了“ PuTTY选美大赛”(我没有,也没有运行它或类似的东西)。 Here是一个StackOverflow帖子,具有相同的错误,但来自试图自己创建socket的人,并且似乎直接用Python运行它,而不是通过Pyinstaller创建的可执行文件运行。 Here是另一篇文章,建议多次尝试创建套接字,我已实现并仍然遇到问题。
  • 重新启动计算机并以全新的启动状态运行可执行文件

这是我的.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'
)

感谢您的帮助。

0 个答案:

没有答案