我正在尝试将图像上传到远程服务器上的上传文件夹。文件夹结构始终是uploads/year/month/
,我无法让 paramiko 检查文件夹是否存在,如果不存在。
SSH 连接正常,上传文件也正常,但在上传目录中创建子文件夹不起作用。
我在这里遇到了看起来像解决方案的东西。我有同样的问题,但我在 iOS 上并使用 Pythonista。选项 A:我的代码完全错误,或者选项 B 是 iOS/Pythonista 特有的问题。
因此,来自另一个线程(上面链接)的代码设置了一个定义并运行一个尝试/错误循环来测试通过它的文件夹是否已经存在,如果不存在则创建它们。在我下面的脚本中,它是# Set Definition for "mkdir -p"
.
remoteFilePath
用…调用它
- 不必要的,因为:理想情况下,它应该只测试是否
datePath
存在,因为remotePath
肯定存在 - 可能有问题,因为:
fileName
没有路径,将由下一个命令放在那里。
我尝试调整脚本,但不知何故我无法使其工作。
无论我尝试什么,我都会遇到错误:
- 使用版本 1:
TypeError: mkdir_p() takes exactly 2 arguments (1 given)"
- 使用版本 2:
AttributeError: 'tulpe' object has no attribute 'rfind'
- 使用版本 3:
Exception: unknown type for (/home/userZ/Dropbox/uploads/year/month', 'test.png') type <type 'tuple'>
这是脚本相关部分的片段(如果您更喜欢它的外观,也可以是要点):
# Set Variables
fileName = "temp.png"
remotePath = "/home/userZ/Dropbox/uploads/"
datePath = "year/month/"
remoteFilePath = remotePath + datePath + fileName #
# Set Definition for "mkdir -p"
def mkdir_p(sftp,remote_directory):
remote_dirname, basename = os.path.split(remote_directory)
mkdir_p(os.path.dirname(remote_directory))
try:
sftp.chdir(name)
except IOError:
sftp.mkdir(name)
sftp.chdir(name)
try:
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport) # Start SFTP client
# Try to make remote path - 3 Versions and all fail
mkdir_p(sftp,remoteFilePath) # Version 1
#mkdir_p(sftp, os.path.split(remoteFilePath)) # Version 2
#sftp.mkdir(os.path.split(remoteFilePath)) # Version 3
# Put file to remote
sftp.put('temp.png', remoteFilePath)
# Close connection
finally:
transport.close()
sftp.close()
任何帮助表示赞赏。(小心:OP = Python noob)。我依赖 Paramiko,因为我的共享主机只支持 SFTP。否则我会选择 FTPlib。