Ответ 1
Как уже упоминалось, вопрос не является специфичным для Python. Когда процесс порождается, родительская обязанность - устанавливать описатели дочерних файлов (или разрешать их наследование).
Итак, это даже не специфичный для ОС, а действительно специфический для приложения. Например, у вас может быть другой anser для Gnome и KDE. Или при выполнении файла из Windows Explorer или 7-Zip (я думаю, я знаю, как это работает в Unix, не так уверенном в Windows). Различные приложения, создающие процесс, могут создавать различные варианты.
В Linux вы можете узнать, запустив lsof
в процессе python, который отобразит открытые файлы и скажет вам, где именно идет ваша stdout. Здесь ваш код изменился, чтобы сделать именно это:
#!/usr/bin/env python
# vi: ai sts=4 sw=4 et
import sys, os, pprint
import subprocess
f = open("/tmp/output.txt", "w")
for stream in (sys.stdout, sys.stdin, sys.stderr):
print (stream, file=f)
print ("STTY?", stream.isatty(), file=f)
print ("fileno:", stream.fileno(), file=f)
print ("name:", stream.name, file=f)
# print (pprint.pprint(dir(stream)), file=f)
print (file=f)
subprocess.call ("lsof -p %s" % os.getpid(), stdout = f, shell = True)
Фактически важна только последняя строка. См. Вывод для обычного запуска:
(...)
test.py 29722 xxx 0u CHR 136,4 0t0 7 /dev/pts/4
test.py 29722 xxx 1u CHR 136,4 0t0 7 /dev/pts/4
test.py 29722 xxx 2u CHR 136,4 0t0 7 /dev/pts/4
И при перенаправлении вывода в файл:
(...)
test.py 29728 xxx 0u CHR 136,4 0t0 7 /dev/pts/4
test.py 29728 xxx 1w REG 0,38 0 2070222 /tmp/asdf.txt
test.py 29728 xxx 2u CHR 136,4 0t0 7 /dev/pts/4
Посмотрите, что файл №1 изменился? То же самое произойдет, когда вы запустите его из Unity, сообщив, где это происходит.
Я точно не воспроизвел вашу проблему, так как мой файловый менеджер Gnome 3 не запускает сценарии, подобные этому, и я бы не стал заглядывать в него, но мне любопытно узнать, где вы находитесь.