【问题标题】:Paramiko raising 'TypeError: catching classes that do not inherit from BaseException is not allowed' at the end of a script that uses `sftp.file/open`Paramiko 在使用“sftp.file/open”的脚本末尾引发“TypeError:不允许捕获不从 BaseException 继承的类”
【发布时间】:2021-02-08 15:44:55
【问题描述】:

我正在编写一个脚本来获取服务器中的 CSV 文件并将其复制到 PostgreSQL 表中。在复制文件时,我找不到解决 Paramiko 引发的错误的方法。我不太明白这个错误,也没有找到可以帮助我解决这个问题的相关帖子。

SFTP 连接运行良好,数据库远程访问也运行良好,这是有问题的代码块:

try:
    sftp = paramiko.SFTPClient.from_transport(transport)
    sftp = transport.open_sftp_client()
    print("SFTP Client : Open")
except Exception as e:
    msg = "Error connecting via ssh: %s" % e
    raise paramiko.SSHException(msg)

XT = "*.csv"
for filename in sftp.listdir(SSH_DIR):
    print(filename,'if-found')

    print("entered loop")
    path = '/%s/%s' % (SSH_DIR, filename)
   
    fobj = sftp.file(os.path.join(SSH_DIR,filename), 'rb')
    print(fobj)
    cur.execute('TRUNCATE TABLE %s' % TABLE_NAME)
    sql = "COPY %s FROM STDIN WITH DELIMITER AS ','  csv header"
    table = 'my_table'
    cur.copy_expert(sql=sql % table, file=fobj)
    conn.commit()

transport.close()

这是执行脚本时出现的错误

Database connected...
SSH connection succesful
SFTP Client : Open
kpis_inventory_analysis.csv if-found
entered loop
<paramiko.sftp_file.SFTPFile object at 0x7f0369d81f28>
Exception ignored in: <bound method SFTPFile.__del__ of <paramiko.sftp_file.SFTPFile object at 0x7f0369d81f28>>
Traceback (most recent call last):
  File "/home/ubuntu/myenv/lib/python3.6/site-packages/paramiko/sftp_file.py", line 76, in __del__
  File "/home/ubuntu/myenv/lib/python3.6/site-packages/paramiko/sftp_file.py", line 108, in _close
TypeError: catching classes that do not inherit from BaseException is not allowed

对于这个问题的任何帮助将不胜感激

【问题讨论】:

    标签: python postgresql sftp psycopg2 paramiko


    【解决方案1】:

    我猜这个错误是因为你没有关闭 SFTP 文件。当 Python 垃圾在脚本末尾收集代表未关闭 SFTP 文件的 Paramiko 对象时,它会失败,因为底层 SFTP 连接已经关闭。

    请确保在停止使用文件后关闭它:

        with sftp.file(SSH_DIR + "/" + filename, 'rb') as fobj:
            print(fobj)
            cur.execute('TRUNCATE TABLE %s' % TABLE_NAME)
            sql = "COPY %s FROM STDIN WITH DELIMITER AS ','  csv header"
            table = 'my_table'
            cur.copy_expert(sql=sql % table, file=fobj)
    

    旁注:不要将os.path.join 用于 SFTP 路径。 SFTP 路径需要使用正斜杠。而os.path 使用本地系统分隔符。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多