django app 多硬盘 [Errno 18] 无效的跨设备链接

Posted

技术标签:

【中文标题】django app 多硬盘 [Errno 18] 无效的跨设备链接【英文标题】:django app multiple hard drives [Errno 18] Invalid cross-device link 【发布时间】:2017-02-26 13:24:22 【问题描述】:

我在 Debian 服务器上有一个 Django 应用程序,我当前磁盘上的当前 site_media 目录已满。所以我想在第二个磁盘上上传文件。服务器上的路径是 /disk :

        obj = form.save(commit=False)
        obj.user_id = self.request.user.pk
        obj.save()
        initial_path = obj.file.path
        print(initial_path)
        new = settings.MEDIA_ROOT_NEW + obj.file.name
        print(new)
        os.rename(initial_path,new)
        shutil.move(initial_path, new)

在我的 settings.py 中有:

        MEDIA_ROOT = os.path.join(PROJECT_PATH, 'site_media/')
        MEDIA_ROOT_NEW = '/disk/site_media/'

我仍然得到错误: django [Errno 18] 跨设备链接无效

有什么想法吗?

【问题讨论】:

回过头来看这一点,简单地迁移到新位置而不是让您的应用程序将数据保存在原始位置然后复制它会更有意义。你能不把MEDIA_ROOT改成/disk/site_media/吗? 你看,我们有两个磁盘。首先 (MEDIA_ROOT) 已满。我们必须这样。我必须设法在 MEDIA_ROOT_NEW 路径的第二个磁盘上上传文件,并从该磁盘读取。有什么想法吗?? 我认为提出合适的解决方案需要的不仅仅是关于 SO cmets 的对话。在不知道为什么必须保持MEDIA_ROOT 原样的确切原因的情况下,我仍然建议“获取更大的磁盘,从MEDIA_ROOT 迁移当前数据,然后将您的应用程序指向新磁盘。”越简单越好 - 我想不出理由来证明必须协调对两个磁盘的读取和写入。 我和你在一起!但我们谈论的是我工作的公司。这就是我努力寻找解决方案的原因。 【参考方案1】:

os.rename() 可能会失败across 不同的文件系统。

如果 src 和 dst 位于不同的文件系统上,则某些 Unix 风格的操作可能会失败。

shutil.move()should工作

如果目标位于当前文件系统上,则使用 os.rename()。否则,src 被复制(使用 shutil.copy2())到 dst,然后被删除。

但您在 shutil.move(initial_path, new) 之前有一个 os.rename(initial_path,new)。删除第一个os.rename(),它应该可以工作。

【讨论】:

Soory 点击进入!我按照你说的做了,效果很好。现在的问题是它不会从 /disk/site_media 路径中读取。我收到一个错误,它没有找到文件 在不知道确切的文件路径并能够检查系统上的文件的情况下,除了说“您确定文件存在吗?”之外,很难帮助诊断。你确定它在打印行中注销的文件存在吗?

以上是关于django app 多硬盘 [Errno 18] 无效的跨设备链接的主要内容,如果未能解决你的问题,请参考以下文章

Django-import-export-celery 导入错误 [Errno 13] 权限被拒绝

Django- [Errno 111] 使用 smtp 时连接被拒绝

尝试使用 Django 发送电子邮件时出现“[Errno 101] 网络无法访问”

Django OSError:[Errno 13] 权限被拒绝

Amazon + Django 每 12 小时出现一次 [Errno 5] 输入/输出错误

Django [Errno 13] 权限被拒绝:'/var/www/media/animals/user_uploads'