Это очень интересная проблема.
Я был так заинтригован, что я запустил код локально и изучил, что происходит:
В первом случае (выполняется without -s
) оболочка /proc/self/fd/0
это /dev/null
, но работает with -s
/proc/self/fd/0
оболочки /dev/pts/7
в моем случае.
$ pgrep -f has-st
12727
$ ls -la /proc/12727/fd/0
lrwx------ 1 quoyn quoyn 64 Aug 4 00:13 /proc/12727/fd/0 -> /dev/pts/7
и
$ pgrep -f has-st
12793
$ ls -la /proc/12793/fd/0
lr-x------ 1 quoyn quoyn 64 Aug 4 00:17 /proc/12793/fd/0 -> /dev/null
Это si, потому что когда вы запускаете с "-s" pytest не захватывает терминал, а просто передает его через него, поэтому это /dev/pts/7
. Если я запустил ls -l /proc/self/fd/0
в своем терминале после того, как pytest завершил работу, я действительно получаю:
lrwx------ 1 quoyn quoyn 64 Aug 4 00:29 /proc/self/fd/0 -> /dev/pts/7
Вы также можете попробовать без pytest , только python:
import subprocess
s = subprocess.run(["ls", "-l", "/proc/self/fd/0"], stderr=subprocess.PIPE, stdout=subprocess.PIPE, input=None, check=True, shell=False)
print(s.stdout)
И попробуйте выполнить как python code_above.py
и echo '' | python code_above.py
EDIT:
И чтобы ответить на второй вопрос
Как успешно запустить этот pytest без -s?
Используйте псевдотерминал самостоятельно. Запустите подпроцесс в pty . \
EDIT2:
Минимальный тест для воспроизведения / демонстрации этой проблемы, запустите следующий код как pytest test.py
и pytest -s test.py
:
import sys
def test():
assert sys.stdin.isatty()