我对以下 python 代码有疑问
import os
print("Can I write into the tv folder?",os.access("/tv", os.W_OK))
print("Does the /tv/test file exists?", os.access("/tv/test", os.R_OK))
with open("/tv/test", "w") as f:
f.write("toto")
print("Does the /tv/test file exists now?", os.access("/tv/test", os.R_OK))
with open("/tv/test", "r") as f:
print("Content of the /tv/test file:")
print(f.read())
打印出来
Can I write into the tv folder? False
Does the /tv/test file exists? False
Does the /tv/test file exists now? True
Content of the /tv/test file;
toto
但根据第一次调用os.access
,我应该无法编写测试文件...
我的问题不是它能够创建文件,我想要那个。但是测试应该会产生相关的结果。 (我使用的一个软件因此出现故障)
我在树莓派上的 docker 容器(Docker 版本 20.10.7)中运行 Python 3.8.10,tv 文件夹是由 docker 挂载的远程 nfs 共享。
root@7f0a44aad8a9:/> ls -la /tv
total 8
drwxrwxrwx 1 abc abc 3826 Jul 27 14:18 .
drwxr-xr-x 1 root root 4096 Jul 27 14:12 ..
drwxrwxrwx 1 abc abc 988 May 13 07:30 DARK
... (a lot of other folders)
-rwxrwxrwx 1 abc abc 4 Jul 27 14:18 test
我的 docker-compose 文件:
version: "3.4"
services:
bazarr:
image: ghcr.io/linuxserver/bazarr
container_name: bazarr
volumes:
- shows:/tv
ports:
- 6767:6767
dns: 1.1.1.1
restart: unless-stopped
volumes:
shows:
driver_opts:
type: "nfs"
o: "nfsvers=3,addr=xxx,soft,rw"
device: ":xxx"
我知道 os.access
可以给出误报,但可以给出误报?
有没有人看过这个?
这是意料之中的吗?
编辑:问题不是特定于 python 的
root@6c5dd99ee211:/> if [ -w /tv ]; then echo "WRITABLE"; else echo "NOT WRITABLE"; fi
NOT WRITABLE
为什么?
答案 0 :(得分:2)
与 Python 相比,这与 POSIX 文件系统(包括 *nix 文件系统)的关系更大。
<块引用>但是根据第一次调用os.access,我应该是写不出测试文件...
不,不幸的是这是错误的(但不可否认的是有些不直观)。
在 POSIX 文件系统中,您可能没有写入目录的权限(这是您检查的内容),但这并不意味着您不能写入该目录中的文件。这意味着您不能将新文件写入所述目录。
示例:
roomdetails
请注意,我无法将新文件写入目录 (base) mmessersmith@HP-ZBK-0425:~$ mkdir test_dir
(base) mmessersmith@HP-ZBK-0425:~$ touch test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ cat test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ chmod 777 test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ chmod 500 test_dir
(base) mmessersmith@HP-ZBK-0425:~$ touch test_dir/new_file.txt
touch: cannot touch 'test_dir/new_file.txt': Permission denied
(base) mmessersmith@HP-ZBK-0425:~$ echo "123" > test_dir/abc.txt
(base) mmessersmith@HP-ZBK-0425:~$ cat test_dir/abc.txt
123
(base) mmessersmith@HP-ZBK-0425:~$ ls -al test_dir/
total 12
dr-x------ 2 mmessersmith mmessersmith 4096 Jul 27 09:32 .
drwxr-xr-x 24 mmessersmith mmessersmith 4096 Jul 27 09:31 ..
-rwxrwxrwx 1 mmessersmith mmessersmith 4 Jul 27 09:32 abc.txt
,但我仍然可以在 test_dir
内写入 abc.txt
。在上面的示例中,您需要检查 test_dir
。在我上面例子的 REPL 中:
os.access("/tv/test", os.W_OK)
最后,请注意 (base) mmessersmith@HP-ZBK-0425:~$ python
Python 3.8.3 (default, May 19 2020, 18:47:26)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.access('test_dir', os.W_OK)
False
>>> os.access('test_dir/abc.txt', os.R_OK)
True
>>> os.access('test_dir/abc.txt', os.W_OK)
True
是对 linux/unix 访问的简单包装:https://manpages.debian.org/buster/manpages-dev/access.2.en.html。
所以不,这不是误报或误报,这只是文件系统的工作方式。