通过NFS上载文件时出现OSerror

vmo*_*eco 6 django macos nfs python-3.x

当我尝试通过django管理界面上传媒体文件时,我收到此错误:

OSError: [Errno 45] Operation not supported
Run Code Online (Sandbox Code Playgroud)

这是追溯的最后一行:

  File "/path/to/home/Envs/myenv/lib/python3.5/site-packages/django/core/files/locks.py", line 112, in unlock
    ret = fcntl.lockf(_fd(f), fcntl.LOCK_UN)
Run Code Online (Sandbox Code Playgroud)

我找到了这个答案,其中一条评论让我看到了这张票,然后是这个提交,在票证中作为"解决方法"引入(见下文).

以下是django/core/files/locks.py根据解决方法我应该做的更改.

  elif system_type == 'posix':
     def lock(file, flags):
-        fcntl.flock(fd(file), flags)
+        fcntl.lockf(fd(file), flags)

     def unlock(file):
-        fcntl.flock(fd(file), fcntl.LOCK_UN)
+        fcntl.lockf(fd(file), fcntl.LOCK_UN)
Run Code Online (Sandbox Code Playgroud)

我试图手动反转此提交的更改(用flock()调用替换lockf()调用),但我仍然得到相同的错误.还有补丁,但这些补丁看起来很旧(约7岁,我使用django 1.9和python 3.5).

我该怎么解决这个问题?

编辑:

正如plombix所提到的,我的主目录安装在NFS上.

编辑2:

我也尝试用fcntl.fcntl()调用替换flock调用,我得到了一个不同的错误:

OSError: [Errno 14] Bad address
Run Code Online (Sandbox Code Playgroud)

plo*_*bix 2

您可能想要指定您位于 NFS 文件系统上;P

lockf == flock 不受 NFS 支持

参见堆栈中的其他帖子“ flock vs lockf

如果语义(描述符传递、分叉等方面的行为)可以接受,那么您应该更喜欢使用 lockf()/fcntl() 锁而不是 fancy() 锁。

Linux 中的锁,只是因为前者适用于 NFS 等文件系统,而后者则不然。

在 BSD 和 Mac OS X 上,我相信您需要显式使用 fcntl()。

我建议您将操作重定向到 /temp 或 /goinfre/