Thank you for viewing my post.
Currently, I am creating a program to download update files from an SFTP server on the same network. However, no matter where I place the files downloaded from the SFTP server, I always get a PermissionError[Error13], and I am having trouble.
Below is the main program.
I referred to this link for the class. Link
import pysftp
import os
from win32com.shell import shell, shellcon
import sys
import ctypes
class Sftp:
def __init__(self, hostname, username, password, port=22):
"""Constructor Method"""
# Set connection object to None (initial value)
self.connection = None
self.hostname = hostname
self.username = username
self.password = password
self.port = port
def connect(self):
"""Connects to the sftp server and returns the sftp connection object"""
try:
# Get the sftp connection object
self.connection = pysftp.Connection(
host=self.hostname,
username=self.username,
password=self.password,
port=self.port,
)
except Exception as err:
raise Exception(err)
finally:
print(f"Connected to {self.hostname} as {self.username}.")
def disconnect(self):
"""Closes the sftp connection"""
self.connection.close()
print(f"Disconnected from host {self.hostname}")
def listdir(self, remote_path):
"""lists all the files and directories in the specified path and returns them"""
for obj in self.connection.listdir(remote_path):
yield obj
def listdir_attr(self, remote_path):
"""lists all the files and directories (with their attributes) in the specified path and returns them"""
for attr in self.connection.listdir_attr(remote_path):
yield attr
def download(self, remote_path, target_local_path):
"""
Downloads the file from remote sftp server to local.
Also, by default extracts the file to the specified target_local_path
"""
try:
print(
f"downloading from {self.hostname} as {self.username} [(remote path : {remote_path});(local path: {target_local_path})]"
)
# Create the target directory if it does not exist
path, _ = os.path.split(target_local_path)
if not os.path.isdir(path):
try:
os.makedirs(path)
except Exception as err:
raise Exception(err)
# Download from remote sftp server to local
self.connection.get(remote_path, target_local_path)
print("download completed")
except Exception as err:
raise Exception(err)
def upload(self, source_local_path, remote_path):
"""
Uploads the source files from local to the sftp server.
"""
try:
print(
f"uploading to {self.hostname} as {self.username} [(remote path: {remote_path});(source local path: {source_local_path})]"
)
# Download file from SFTP
self.connection.put(source_local_path, remote_path)
print("upload completed")
except Exception as err:
raise Exception(err)
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
if __name__ == "__main__":
if not is_admin():
print("権限要求")
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
sftp = Sftp(
hostname="***.***.***.***",
username="****-user",
password="**************",
)
tmpath = r"C:Users****Downloadstest"
assert os.path.isdir(mmpath)
print(tmpath)
# Connect to SFTP
sftp.connect()
# Lists files with attributes of SFTP
path = "/contents"
#print(f"List of files with attributes at location {path}:")
for file in sftp.listdir_attr(path):
print(file.filename, file.st_mode, file.st_size, file.st_atime, file.st_mtime)
sftp.download("./"+file.filename, tmpath)
sftp.disconnect()
Also, here is the error part.
PermissionError: [Errno 13] Permission denied: 'C:\Users\***\Downloads\test'
During handling of the above exception, another exception occurred:
Error13 was written as a permission issue, but I have given write permission to the test directory. Also, I am running the main program with administrator privileges.
As a test, I was able to run the following program to create a file without any errors.
path = r'C:Users***Downloadstestww.txt'
f = open(path, 'w')
f.write('')
f.close()```
Yu w is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.