7

这个问题与在 Python 中以特定权限写入文件的答案有关,用于打开具有特定权限的文件以进行写入(在 python 中)。

答案中的代码如下所示:

with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644)) as out:
  out.write("hello\n")

2.7.1 中的这段代码(我的公司没有安装 2.7.3)产生:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IOError: File not open for writing

os.fdopen有自己的模式参数,但设置无济于事:

>>> with os.fdopen(os.open('foo', os.O_APPEND | os.O_CREAT, 0o644), 'a') as out:
...   out.write("hello\n")
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

长话短说,我无法弄清楚如何实际写入已通过os.fdopenand打开的文件os.open。有任何想法吗?2.7.1 中的已知错误?

提前致谢!

4

2 回答 2

8

您必须选择 O_RDONLY、O_WRONLY 或 O_RDWR 之一作为 open() 的“基本”模式参数。

您没有明确这样做,因此假定为 O_RDONLY(许多系统上为零)。Python 的os.fdopen看到你指定了 O_RDONLYO_APPEND,这有点傻。Python 用您看到的 EINVAL(“无效参数”)错误来抱怨这种组合。

(事实上​​,如果你strace(1)的脚本——我假设这里是 Linux——我怀疑你会看到没有遇到“自然” EINVAL。相反,python 执行你的os.open()/ open(2),然后检查文件描述符上的标志(F_GETFL)就在之前引发异常。)

于 2012-11-06T19:20:29.693 回答
1

确实很时髦。

os.fdopen(os.open("a1", os.O_CREAT | os.O_RDWR | os.O_APPEND | os.O_EXCL))

工作,而

os.fdopen(os.open("a1", os.O_CREAT | os.O_WRONLY | os.O_APPEND | os.O_EXCL))

向. OSError: [Errno 22] Invalid argument_os.fdopen()

所以 os.fdopen() 需要对 FD 进行完全的读/写访问。除非你这样做

os.fdopen(fd, "w") 

它适用于只写文件。

于 2013-09-03T15:40:09.440 回答