Подавите вывод в вызовах Python к исполняемым файлам

Проблема здесь в том, что для того, чтобы компьютерная программа знала, что вы дали неправильный ответ для значения (как, скажем, говоря, что «50 слишком мало», когда на самом деле ответ 50), необходимо запишите его догадки и ваши ответы на них.

Таким образом, после того, как оно сделает предположение и вы получите «более низкий» или «более высокий» ответ, вы можете поместить предположение в список low_guesses или high_guesses, а затем изучить этот список в конце игры. Вы можете получить что-то вроде этого:

low_guesses = []
high_guesses = []

while True:  # breaks out when user types "same"
    response = input("Is the number higher, lower, or the same as " + str(guess) + "? ")
    if response == "lower":
        # Add the guess to the low_guesses array:
        low_guesses.append(guess)
    elif response == "higher":
        # Add the guess to the high_guesses array:
        high_guesses.append(guess)
    else:
        # Secret number found, so break out of loop:
        break

# Outside of the loop, examine your low_guesses and high_guesses lists.

Вы можете проверить списки, убедившись, что все элементы в low_guesses меньше секретного числа и что все элементы в high_guesses больше чем секретный номер. Если это не так, вы знаете, что что-то не так.

(Также несколько советов: пожалуйста, не называйте переменные l или lst. Они настолько похожи на 1 или 1st, что затрудняют чтение вашего кода, даже когда читающие ваш код уже знают, что они представляют имена переменных .)

44
задан Eddie 30 March 2009 в 22:49
поделиться

5 ответов

Если у Вас есть Python 2.4, можно использовать модуль подпроцесса:

>>> import subprocess
>>> s = subprocess.Popen(['cowsay', 'hello'], \
      stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
 _______ 
< hello >
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
57
ответ дан Manuel 26 November 2019 в 21:36
поделиться
import os
import subprocess

command = ["executable", "argument_1", "argument_2"]

with open(os.devnull, "w") as fnull:
    result = subprocess.call(command, stdout = fnull, stderr = fnull)

Если команда не имеет никаких аргументов, можно просто обеспечить ее как простую строку.

Если Ваша команда будет полагаться на функции оболочки как подстановочные знаки, каналы или переменные среды, то необходимо будет обеспечить целую команду как строку и также указать shell = True. Этого нужно избежать, тем не менее, так как это представляет опасность безопасности, если содержание строки тщательно не проверено.

102
ответ дан DNS 26 November 2019 в 21:36
поделиться

Как os.system () упоминание документов, используйте модуль подпроцесса, и, если Вы любите, устанавливаете stdout=open (os.devnull, 'w') (и возможно то же для stderr) при открытии подпроцесса.

8
ответ дан Devin Jeanpierre 26 November 2019 в 21:36
поделиться

Я знаю, что игра уже поздно, но почему бы просто не перенаправить вывод на / dev / null из os.system? Например:

tgt_file = "./bogus.txt"
os.sytem("d2u '%s' &> /dev/null" % tgt_file)

Кажется, это работает в тех случаях, когда вы не хотите иметь дело с subprocess.STDOUT.

1
ответ дан 26 November 2019 в 21:36
поделиться

Если ваша поисковая система приведет вас к этому старому вопросу (как и я), имейте в виду, что использование PIPE может привести к взаимоблокировкам . { {1}} Действительно, поскольку каналы буферизуются, вы можете записать в канал определенное количество байтов, даже если его никто не прочитает. Однако размер буфера конечен. И, следовательно, если ваша программа A имеет вывод больше, чем буфер, A будет заблокирован при записи, в то время как вызывающая программа B ожидает завершения A. Но нет, в этом конкретном случае ... см. Комментарии ниже.

Тем не менее, я рекомендую использовать решение Девина Жанпьера и DNS.

12
ответ дан 26 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: