Paramiko 在使用"sftp.file/open"的脚本末尾引发"TypeError:不允许捕获不继承自 BaseException 的类"



我正在编写一个脚本,在服务器中拾取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

在这个问题上任何帮助都将非常感谢

我猜错误发生是因为您没有关闭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)

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

相关内容

最新更新