The problem is what the title tells and can be produced by the snippet below.
import sys
import os
sys.stdout.write("%s\n" % sys.stdin.mode)
sys.stdout.flush()
f = os.fdopen(sys.stdin.fileno(), "r")
f.write("aaaa")
f.flush()
f.read()
f.close()
When running this snippet with nohup, which changes the stdin's mode to O_WRONLY(which can also be shown below because the write operation will fail), this snippet will still give sys.stdin.mode as r, both in 2.7 and 3.4.
In 2.7, the os.fdopen will fail with Invalid Argument error because the mode r given to fdopen conflicts with stdin's real mode w. In 3.4, os.fdopen won't give any error.
Both in 2.7 and 3.4, if I change the mode given to os.fdopen to w:
f = os.fdopen(sys.stdin.fileno(), "w")
The write operation will succeed and the read operation will fail.
The output produced in nohup.out for 2.7 is:
r
Traceback (most recent call last):
File "test.py", line 9, in <module>
f.read()
IOError: File not open for reading
For 3.4:
r
Traceback (most recent call last):
File "test.py", line 9, in <module>
f.read()
io.UnsupportedOperation: not readable
I run the snippet with nohup on Gnome Terminal, bash, Ubuntu 15.04. The Python version is 2.7.9 and 3.4.3.
|